home *** CD-ROM | disk | FTP | other *** search
/ Aminet 16 / Aminet 16 (1996)(GTI - Schatztruhe)[!][Dec 1996].iso / Aminet / misc / emu / QDOS2.lha / QLsource / ROMsrc / SYS / QDOS4_asm < prev    next >
Text File  |  1995-05-25  |  48KB  |  2,348 lines

  1. */beginfile QDOS4_asm
  2. ; --------------------------------------------------------------
  3. ; QDOS4_asm - The QDOS kernel
  4. ;       - last modified 25/05/95
  5. ; QDOS-Amiga sources by Rainer Kowallik
  6. ;    ...latest changes by Mark J Swift
  7. ; --------------------------------------------------------------
  8.  
  9. ; --------------------------------------------------------------
  10. ; microdrive routines to switch on & off motor and read & write
  11. ; sectors used to reside here, various 8049 routines also.
  12. ; also patch out polled task for keyboard reading (PLIST)
  13. ; and schedular task for serial I/O (SHLST1)
  14.  
  15. L029FC:
  16.  
  17. ; --------------------------------------------------------------
  18. ;*/beginoverlay
  19. MSG_FIX:
  20.     movem.l    d0-d2/a0,-(a7)
  21.     moveq    #0,d0
  22.     trap    #1
  23.     move.l    $14A(a0),a2
  24.     move.w    0(a2,d5.w),d5
  25.     lea    0(a2,d5.w),a2
  26.     movem.l    (a7)+,d0-d2/a0
  27.     rts
  28. ;*/endoverlay
  29. ; --------------------------------------------------------------
  30.  
  31. ; --------------------------------------------------------------
  32. ;*/beginoverlay
  33. ;*/beginfilling
  34. NOP02FAE:
  35.     DCB.w    ($2FAE-(NOP02FAE-ORG0))/2,$4E71
  36. L02FAE:
  37. ;*/endfilling
  38. ;*/endoverlay
  39. ; --------------------------------------------------------------
  40. ; allocate common heap
  41. MM_ALCHP:
  42.     LEA    $08(A6),A0    ;SV.CHPFR First free space
  43.                 ; in common heap area
  44.     MOVEQ    #$0F,D2
  45.     JSR    L03106(PC)    ;*/undomodify BSR L03106
  46.                 ; allocate area in heap
  47.                 ; (D1 bytes)
  48.     BLT.S    L02FD6
  49.     LEA    $4(A6),A2    ;SV.CHEAP Base of common
  50.                 ; heap area
  51.     CMPA.L    A1,A2
  52.     BEQ.S    L02FC6
  53.     CLR.L    $0008(A1)
  54. L02FC6:
  55.     MOVE.L    D1,D0
  56.     ADDQ.W    #4,A0        ;*/undomend ADDQ.L #4,A0
  57.     SUBQ.L    #4,D0
  58. ; --------------------------------------------------------------
  59. ;*/beginundoinsert
  60. ;    BCLR    #2,$28002    ; This flag bit has  been
  61.                 ; added to provide
  62. ;    BNE.S    L0HILF        ; memory allocation without
  63.                 ; destroying data
  64. ;*/endundoinsert
  65. ; --------------------------------------------------------------
  66. L02FCC:
  67.     CLR.L    (A0)+
  68.     SUBQ.L    #4,D0
  69.     BGT.S    L02FCC
  70.     SUBA.L    D1,A0        ; A0= base of reserved space
  71.     BRA.S    L02FF8
  72. ; --------------------------------------------------------------
  73. ;*/beginundoinsert
  74. L0HILF:
  75. ;    CLR.L    (A0)+
  76. ;    CLR.L    (A0)+
  77. ;    SUBQ.L    #8,D0
  78. ;    ADD.L    D0,A0
  79. ;    SUBA.L    D1,A0
  80. ;    MOVEQ    #0,D0
  81. ;    BRA.S    L02FF8
  82. ;*/endundoinsert
  83. ; --------------------------------------------------------------
  84. ; allocate memory in transient program area
  85. L02FD6:
  86.     MOVE.L    D1,-(A7)
  87.     ADDA.L    (A0),A1
  88.     CMPA.L    $0C(A6),A1    ;SV.FREE    Base of free
  89.                 ; area
  90.     BNE.S    L02FE2
  91.     SUB.L    (A0),D1
  92. L02FE2    JSR    L0324E(PC)    ;*/undomodify BSR L0324E
  93.     BNE.S    L02FF6
  94.     SUBA.L    D1,A0
  95.     LEA    $8(A6),A1    ;SV.CHPFR   First free space
  96.                 ; in common heap area
  97.     JSR    L0315E(PC)    ;*/undomodify BSR L0315E
  98.     MOVE.L    (A7)+,D1
  99.     BRA.S    MM_ALCHP
  100. L02FF6    ADDQ.W    #4,A7        ;*/undomend ADDQ.L #4,A7
  101. L02FF8    RTS
  102. RESERVD1 ; reserve D1 bytes in transient programm area
  103.     LEA    $18(A6),A0    ;SV.TRNFR First free space
  104.                 ; in Trans. Prog. Area
  105.     MOVEQ    #$0F,D2
  106.     MOVEQ    #1,D0
  107.     JSR    L03134(PC)    ;*/undomodify BSR L03134
  108.     TST.L    D2
  109.     BGT.S    L03032
  110.     MOVE.L    D1,-(A7)
  111.     LEA    $14(A6),A1    ; base of transient program
  112.                 ; area
  113.     ADDA.L    4(A1),A1
  114.     CMPA.L    $14(A6),A1    ; base of transient program
  115.                 ; area
  116.     BNE.S    L0301C
  117.     SUB.L    (A1),D1
  118. L0301C    JSR    L031B8(PC)    ;*/undomodify BSR L031B8
  119.                 ; allocate memory
  120.     BNE.S    L0305A
  121.     SUB.L    D1,$14(A6)    ; base of transient program
  122.                 ; area
  123.     LEA    $18(A6),A1    ; first free space in
  124.                 ; transient program area
  125.     JSR    L0315E(PC)    ;*/undomodify BSR L0315E
  126.     MOVE.L    (A7)+,D1
  127.     BRA.S    RESERVD1
  128. L03032    MOVEA.L    A2,A0
  129.     ADDA.L    4(A2),A0
  130.     MOVE.L    (A0),D3
  131.     CMP.L    D1,D3
  132.     BGT.S    L0304E
  133.     MOVE.L    4(A0),D3
  134.     BEQ.S    L03048
  135.     ADD.L    A0,D3
  136.     SUB.L    A2,D3
  137. L03048    MOVE.L    D3,$0004(A2)
  138.     BRA.S    L03056
  139. L0304E    SUB.L    D1,D3
  140.     MOVE.L    D3,(A0)
  141.     ADDA.L    D3,A0
  142.     MOVE.L    D1,(A0)
  143. L03056    MOVEQ    #0,D0
  144.     RTS
  145. L0305A    ADDQ.W    #4,A7        ;*/undomend ADDQ.L #4,A7
  146.     RTS
  147. MM_RECHP:
  148.     MOVE.L    (A0),D1
  149.     LEA    8(A6),A1     ; first free space in common
  150.                 ; heap aerea
  151.     JSR    L0315E(PC)    ;*/undomodify BSR L0315E
  152.     MOVE.L    (A1),D2
  153.     ADDA.L    D2,A1
  154.     CMPA.L    $0C(A6),A1    ;SV.FREE    Base of free
  155.                 ; area
  156.     BNE.S    L03088
  157.     MOVE.L    D2,D1
  158.     JSR    L03282(PC)    ;*/undomodify BSR L03282
  159.     SUB.L    D1,D2
  160.     BEQ.S    L03084
  161.     ADDA.L    $0004(A2),A2
  162.     MOVE.L    D2,(A2)
  163.     BRA.S    L03088
  164. L03084    CLR.L    4(A2)
  165. L03088    MOVEQ    #0,D0
  166.     RTS
  167. RELE_MEM ; release memory
  168.     MOVE.L    (A0),D1
  169.     LEA    $18(A6),A1    ; first free space in
  170.                 ; transient prog. area
  171.     JSR    L0315E(PC)    ;*/undomodify BSR L0315E
  172.     LEA    $14(A6),A2    ; base of transient program
  173.                 ; area
  174.     ADDA.L    4(A2),A2
  175.     CMPA.L    $14(A6),A2    ;SV.TRNSP   Base of
  176.                 ; transient program area
  177.     BNE.S    L030DE
  178.     MOVE.L    4(A2),-(A7)
  179.     MOVE.L    (A2),D2
  180.     MOVE.L    D2,D1
  181.     JSR    L031C8(PC)    ;*/undomodify BSR L031C8
  182.                 ; release memory
  183.     ADD.L    D1,$14(A6)    ;SV.TRNSP   Base of
  184.                 ; transient program area
  185.     SUB.L    D1,D2
  186.     BEQ.S    L030D2
  187.     MOVEA.L    (A7)+,A1
  188.     ADDA.L    D1,A2
  189.     ADD.L    D1,$18(A6)    ;SV.TRNFR   First free space
  190.                 ; in TPA
  191.     MOVE.L    D2,(A2)
  192.     CLR.L    8(A2)
  193.     MOVE.L    A1,$0004(A2)
  194.     BEQ.S    L030DE
  195.     SUB.L    D1,4(A2)
  196.     BRA.S    L030DE
  197. L030D2    MOVE.L    (A7)+,D2
  198.     BEQ.S    L030DA
  199.     ADD.L    $18(A6),D2    ;SV.TRNFR   First free space
  200.                 ; in TPA
  201. L030DA    MOVE.L    D2,$18(A6)    ;SV.TRNFR   First free space
  202.                 ; in TPA
  203. L030DE    RTS
  204. MT_FREE:
  205.     MOVEQ    #1,D0
  206.     MOVEQ    #0,D1
  207.     LEA    $18(A6),A0    ; first free space in
  208.                 ; transient prog. area
  209.     JSR    L03134(PC)    ;*/undomodify BSR.S L03134
  210.                 ;*/undomodify nop
  211.     MOVEA.L    $10(A6),A0    ; base of basic stack
  212.     SUBA.W    #$200,A0     ;*/undomend SUBA.L #$200,A0
  213.     SUBA.L    $C(A6),A0    ; base of free area
  214.     MOVE.L    A0,D1
  215.     CMP.L    D1,D2
  216.     BLE.S    L03100
  217.     MOVE.L    D2,D1
  218. L03100    BRA    RET_CLD0
  219. MM_ALLOC ; allocate D1 bytes in A0
  220.     MOVEQ    #7,D2
  221. L03106    MOVEQ    #0,D0
  222.     JSR    L03134(PC)    ;*/undomodify BSR.S L03134
  223.                 ;*/undomodify nop
  224.     CMP.L    D1,D2
  225.     BEQ.S    L03122
  226.     BGT.S    L03116
  227.     MOVEQ    #-3,D0        ;out of memory
  228.     RTS
  229. L03116    ADD.L    D1,4(A1)
  230.     MOVEA.L    A0,A1
  231.     ADDA.L    D1,A1
  232.     SUB.L    D1,D3
  233.     MOVE.L    D3,(A1)
  234. L03122    MOVE.L    $0004(A0),D2
  235.     BEQ.S    L0312C
  236.     ADD.L    A0,D2
  237.     SUB.L    A1,D2
  238. L0312C    MOVE.L    D2,$0004(A1)
  239.     MOVE.L    D1,(A0)
  240.     RTS
  241. L03134    ; general memory allocation
  242.     SUBQ.W    #4,A0        ;*/undomend SUBQ.L #4,A0
  243.     ADD.L    D2,D1
  244.     NOT.B    D2
  245.     AND.B    D2,D1
  246.     MOVEQ    #0,D2
  247.     MOVEA.L    D2,A2
  248. L03140    MOVEA.L    A0,A1
  249.     MOVE.L    4(A0),D3
  250.     BEQ.S    L0315C
  251.     ADDA.L    D3,A0
  252.     MOVE.L    (A0),D3
  253.     CMP.L    D1,D3
  254.     BLT.S    L03140
  255.     MOVEA.L    A1,A2
  256.     CMP.L    D2,D3
  257.     BLE.S    L03158
  258.     MOVE.L    D3,D2
  259. L03158    TST.B    D0
  260.     BNE.S    L03140
  261. L0315C    RTS
  262. ; link free space to task
  263. L0315E    CLR.L    8(A0)
  264. MM_LNKFR:
  265.     SUBQ.W    #4,A1        ;*/undomend SUBQ.L #4,A1
  266.     SUBA.L    A2,A2
  267. L03166    MOVEA.L    A2,A3
  268.     MOVEA.L    A1,A2
  269.     MOVE.L    $0004(A1),D2
  270.     BEQ.S    L0317A
  271.     ADDA.L    D2,A1
  272.     CMPA.L    A0,A1
  273.     BLE.S    L03166
  274.     SUBA.L    A0,A1
  275.     BRA.S    L0317C
  276. L0317A    MOVEA.L    D2,A1
  277. L0317C    MOVE.L    A0,D2
  278.     SUB.L    A2,D2
  279.     MOVE.L    D2,$0004(A2)
  280.     MOVE.L    D1,(A0)+
  281.     MOVE.L    A1,(A0)
  282. L03188    MOVEA.L    A2,A1
  283.     MOVEA.L    A3,A2
  284. L0318C    MOVE.L    4(A1),D2
  285.  
  286.     ifd    DoCache
  287. ; --------------------------------------------------------------
  288. ;*/beginoverlay
  289.     beq.s    L0315C        ;*/modify BEQ.S  L031B6
  290.     endif
  291.     ifnd    DoCache
  292.     BEQ.S    L031B6
  293.     endif
  294.  
  295.     MOVEA.L    A2,A3
  296.     MOVEA.L    A1,A2
  297.     ADDA.L    D2,A1
  298.     MOVE.L    A3,D2
  299.     BEQ.S    L0318C
  300.     MOVE.L    (A2),D2
  301.     ADD.L    A2,D2
  302.     CMP.L    A1,D2
  303.     BNE.S    L0318C
  304.     MOVE.L    4(A1),D2
  305.     BEQ.S    L031AC
  306.     ADD.L    (A2),D2
  307. L031AC    MOVE.L    D2,4(A2)
  308.     MOVE.L    (A1),D2
  309.     ADD.L    D2,(A2)
  310.     BRA.S    L03188
  311.  
  312.     ifd    DoCache
  313.                 ;*/removecode L031B6   RTS
  314.     endif
  315.     ifnd    DoCache
  316. L031B6    RTS
  317.     endif
  318.  
  319. L031B8    ; test against memory base, used to allocate memory
  320.     JSR    L0323A(PC)    ;*/undomodify BSR  L0323A
  321.  
  322.     ifd    DoCache
  323.     bne.s    L0315C        ;*/modify BNE.S  L031DE
  324.     endif
  325.     ifnd    DoCache
  326.     BNE.S    L031DE
  327.     endif
  328.  
  329.     BSR.S    L031E0
  330. L031C0    MOVE.L    (A1)+,(A0)+
  331.     SUBQ.L    #4,D0
  332.     BNE.S    L031C0
  333.     BRA.S    L031DE
  334. L031C8    ; test against top of memory, used to release memory
  335.     JSR    L03276(PC)    ;*/undomodify BSR L03276
  336.     NEG.L    D1
  337.  
  338.     ifd    DoCache
  339.     beq.s    L0315C        ;*/modify BEQ.S L031DE
  340.     endif
  341.     ifnd    DoCache
  342.     BEQ.S    L031DE
  343.     endif
  344.  
  345.     BSR.S    L031E0
  346.     NEG.L    D1
  347.     ADDA.L    D0,A0
  348.     ADDA.L    D0,A1
  349. L031D8    MOVE.L    -(A1),-(A0)
  350.     SUBQ.L    #4,D0
  351.     BNE.S    L031D8
  352.  
  353.     ifd    DoCache
  354. L031DE    bra    CLRALL        ;*/modify L031DE     RTS
  355. ;*/endoverlay
  356. ; --------------------------------------------------------------
  357.     endif
  358.     ifnd    DoCache
  359. L031DE    RTS
  360.     endif
  361.  
  362. ; update A6 and A7 for Basic
  363. L031E0:
  364.     MOVEA.L    $68(A6),A3    ; SV.JBBAS Pointer to base
  365.                 ; of job table
  366.     MOVE.L    A0,(A3)
  367.     ADDA.L    D1,A0
  368.     SUB.L    D1,$58(A0)
  369.     SUB.L    D1,$5C(A0)
  370.     MOVEA.L    A0,A1
  371.     SUBA.L    D1,A0
  372.     MOVE.L    $14(A6),D0    ; SV.TRNSP Base of
  373.                 ; transient program area
  374.     SUB.L    A1,D0
  375.     CMPA.L    $64(A6),A3    ; SV.JBPNT Pointer to
  376.                 ; current job table entry
  377.     BNE.S    L0320A
  378.     SUB.L    D1,8(A5)
  379.     MOVE.L    USP,A3
  380.     SUBA.L    D1,A3
  381.     MOVE.L    A3,USP
  382. L0320A    RTS
  383. L0320C    ADDI.L    #$1FF,D1     ; 512 bytes round
  384. L03212    ANDI.W    #$FE00,D1    ;*/undomend ANDI.L#$FFFFFE00
  385.                 ;*/note high word unaltered
  386.     RTS
  387. ; calculate new position of server block
  388. L03218:
  389.     MOVEA.L    $10(A6),A0    ;SV.BASIC Base o BASIC stack
  390.     MOVEQ    #-8,D3
  391.     BRA.S    L03226
  392. L03220:
  393.     MOVEA.L    $0C(A6),A0    ;SV.FREE Base of free area
  394.     MOVEQ    #8,D3
  395. L03226:
  396.     MOVE.L    A0,D0
  397.     SUB.L    A6,D0
  398.     LSR.L    #6,D0        ; number of 512 byte  blocks
  399.     MOVEA.L    $58(A6),A1    ; SV.BTBAS Pointer to base
  400.                 ; of slave block table
  401.     ADDA.L    D0,A1        ;*/mend ADDA.W D0,A1
  402.     MOVE.L    D1,D0
  403.     LSR.L    #6,D0        ; /512
  404.     LSR.L    #3,D0
  405.     RTS
  406. ; Expand BASIC area and update server block
  407. L0323A:
  408.     BSR.S    L0320C
  409.     BSR.S    L03218
  410.     SUBA.L    D1,A0
  411. ; do we intrude beyond SV.FREE - base of free area?
  412.     CMPA.L    $0C(A6),A0    ;*/undomodify
  413.                 ; LEA -$200(A0),A2
  414.                 ; CMPA.L $0C(A6),A2
  415.                 ;*/note would be safer
  416.     ble.s    L0329E
  417.     MOVE.L    A0,$10(A6)    ;SV.BASIC Base o BASIC stack
  418.     ADDA.L    D3,A1
  419.     bra.s    L03270
  420. ; Expand HEAP space and update server block
  421. L0324E:
  422.     BSR.S    L0320C
  423.     BSR.S    L03220
  424.     ADDA.L    D1,A0
  425. ; do we intrude beyond SV.BASIC - base of BASIC stack?
  426.     CMPA.L    $10(A6),A0    ;*/undomodify
  427.                 ; LEA $200(A0),A2
  428.                 ; CMPA.L $10(A6),A2
  429.                 ;*/note would be safer
  430.     bge.s    L0329E
  431.     MOVE.L    A0,$0C(A6)    ; SV.FREE Base of free area
  432.     bra.s    L03270
  433. L03260:
  434. ;?    CMP.L   $58(A6),A1 ; below base of slaveblock table ?
  435. ;?    BLT     L0329A
  436. ;?    CMP.L   $5C(A6),A1 ; behind top of slaveblock table ?
  437. ;?    BGE     L0329A
  438.     MOVEQ    #$0C,D2
  439.     AND.B    (A1),D2
  440.     BEQ.S    L0326C
  441.     JSR    L0352A(PC)    ;*/undomodify BSR L0352A
  442.                 ; forced slaving ?
  443.     BRA.S    L03260
  444. L0326C:
  445.     CLR.B    (A1)        ; mark server block as
  446.                 ; unavailable
  447.     ADDA.W    D3,A1        ;*/undomend ADDA.L D3,A1
  448. L03270:
  449.     DBF    D0,L03260
  450.     bra.s    L0329A
  451. L03276:
  452.     BSR.S    L03212
  453.     BSR.S    L03218
  454.     ADD.L    D1,A0
  455.     MOVE.L    A0,$10(A6)    ;SV.BASIC Base of BASIC
  456.                 ; stack
  457.     bra.s    L03296
  458. ; reclaim slave blocks
  459. L03282:
  460.     BSR.S    L03212
  461.     BSR.S    L03220
  462.     SUBA.L    D1,A0
  463.     MOVE.L    A0,$0C(A6)    ;SV.FREE Base of free area
  464.     SUBA.W    D3,A1        ;*/undomend SUBA.L D3,A1
  465.     BRA.S    L03296
  466. L03290:
  467.     MOVE.B    #1,(A1)
  468.     SUBA.W    D3,A1        ;*/undomend SUBA.L D3,A1
  469. L03296:
  470.     DBF    D0,L03290
  471. L0329A:
  472.     MOVEQ    #0,D0
  473.     BRA.S    L032A0
  474. L0329E:
  475.     MOVEQ    #-3,D0        ; out of memory error
  476. L032A0:
  477.     RTS
  478. ; ***********************************************************
  479. ; * TRAP #2 , I/O open, close, format calls              *
  480. ; ***********************************************************
  481. DO_TRAP2 ; supervisor of TRAP 2
  482.     MOVEA.L    $64(A6),A1    ;SV.JBPNT   Pointer to
  483.                 ; current job table entry
  484.     MOVEA.L    (A1),A1        ; base of job table
  485.     BCLR    #7,$16(A1)    ; Relative addressing (TRAP
  486.                 ; #4 ?)
  487.     BEQ.S    L032B4
  488.     ADDA.L    8(A5),A0     ; add A6 of Basic to A0 (A5
  489.                 ; points to saved regs)
  490. L032B4    SUBQ.B    #1,D0
  491.     BEQ.S    IO_OPEN
  492.     SUBQ.B    #1,D0
  493.     BEQ    IO_CLOSE
  494.     SUBQ.W    #1,D0
  495.     BEQ    IO_FORMT
  496.     SUBQ.W    #1,D0
  497.     BEQ    IO_DELET
  498.     MOVEQ    #-15,D0        ; Bad parameter error
  499.     BRA    RET_TRAP
  500. L032D0:
  501. IO_OPEN:
  502. ; --------------------------------------------------------------
  503. */beginundoinsert
  504. ; The code that had been inserted here was to provide a
  505. ; searchlist for all OPEN_IN (old file) calls.
  506. ; The routine first tried the supplied name, and if the file
  507. ; was not found, it then tried the following paths:
  508. ; RAM1_ ,RAM2_ , FLP1_ , FLP2_ , JAN1_
  509. */endundoinsert
  510. ; --------------------------------------------------------------
  511.     MOVEM.L    A1-A4,-(A7)    ;*/undomend MOVEM.L D7/A1-A4,-(A7)
  512.     MOVEA.L    A0,A1
  513.     JSR    GETJOBID(PC)    ;*/undomodify BSR GETJOBID
  514.                 ; Base address of job -> A0
  515.     EXG    A0,A1        ; channel ID -> A0 / Job
  516.                 ; address -> A1
  517.     MOVEA.L    $78(A6),A3    ;SV.CHBAS   Pointer to base
  518.                 ; of channel table
  519. L032E0    TST.B    (A3)
  520.     BLT.S    L032F0
  521.     ADDQ.W    #4,A3        ;*/undomend ADDQ.L #4,A3
  522.     CMPA.L    $7C(A6),A3    ;SV.CHTOP Pointer to top of
  523.                 ; channel table
  524.     BLT.S    L032E0
  525.     MOVEQ    #-6,D0        ; channel not found error
  526.     BRA.S    L0334C        ; return
  527. L032F0    MOVEA.L    $44(A6),A2    ;SV.DRLST Pointer to list of
  528.                 ; device drivers
  529. L032F4    MOVEM.L    D1-D7/A1-A6,-(A7)
  530.     LEA    -$18(A2),A3
  531.     MOVEA.L    8(A2),A4
  532.     JSR    (A4)
  533.     MOVEM.L    (A7)+,D1-D7/A1-A6
  534.     TST.L    D0
  535.     BEQ.S    L0331E
  536.     CMPI.W    #-7,D0        ; not found error
  537.     BNE.S    L0334C        ; return if not -7
  538.     MOVEA.L    (A2),A2        ; try next device driver
  539.     MOVE.L    A2,D0
  540.     BGT.S    L032F4        ; continue
  541.     JSR    L0355A(PC)    ;*/undomodify BSR L0355A
  542.                 ; now check Directory device
  543.                 ; drivers
  544.     TST.L    D0
  545.     BNE.S    L0334C        ; return with this result
  546. L0331E    ; channel opened without error
  547.     MOVE.L    A0,(A3)
  548.     MOVE.W    $70(A6),D2    ;SV.CHTAG   Current value of
  549.                 ; channel tag
  550.     ADDQ.W    #1,$70(A6)    ; increment channel tag
  551.     ADDQ.W    #4,A0        ;*/undomend ADDQ.L #4,A0
  552.     MOVE.L    A2,(A0)+     ; store address of driver
  553.     MOVE.L    D1,(A0)+     ; owner job
  554.     MOVE.L    A3,(A0)+     ; address to be sent when
  555.                 ; space released
  556.     MOVE.W    D2,(A0)+     ; store channel Tag= channel
  557.                 ; ID
  558.     CLR.W    (A0)+        ; clear status (OK) and
  559.                 ; action for waiting job
  560.     CLR.L    (A0)+        ; job waiting on IO
  561.     SWAP    D2
  562.     SUBA.L    $78(A6),A3    ;SV.CHBAS Pointer to base of
  563.                 ; channel table
  564.     MOVE.W    A3,D2
  565.     LSR.W    #2,D2
  566.     MOVEA.L    D2,A0
  567.     CMP.W    $72(A6),D2    ;SV.CHMAX Highest current
  568.                 ; channel number
  569.     BLS.S    L0334C
  570.     MOVE.W    D2,$72(A6)    ; update Highest current
  571.                 ; channel number
  572. L0334C    MOVEM.L    (A7)+,A1-A4    ;*/undomend MOVEM.L (A7)+,D7/A1-A4
  573.     BRA.S    L03378        ;*/undomodify RTS
  574. IO_CLOSE:
  575.     MOVE.L    A0,D7        ; Store channel ID
  576.     JSR    L03476(PC)    ;*/undomodify BSR L03476
  577.                 ; verify channel ID and get
  578.                 ; linkage block of ID
  579.     MOVEM.L    D1-D7/A1-A6,-(A7)
  580.     MOVEA.L    4(A0),A4     ; Address of driver for
  581.                 ; channel
  582.     LEA    -$18(A4),A3    ; get start of linkage block
  583.                 ; (including all)
  584.     MOVEA.L    $C(A4),A4    ; close routine of driver
  585.     JSR    (A4)        ; call close routine of
  586.                 ; driver
  587.     MOVEM.L    (A7)+,D1-D7/A1-A6
  588.     LSL.W    #2,D7        ; stored channel ID*4
  589.     MOVEA.L    $78(A6),A0    ;SV.CHBAS   Pointer to base
  590.                 ; of channel table
  591.     ADDA.W    D7,A0        ; get address of channel def
  592.                 ; block pointer
  593.     ST    (A0)        ; set flag for closed
  594.                 ; channel
  595. L03378    BRA    RET_TRAP
  596. ; --------------------------------------------------------------
  597. ;  TRAP #3 handling
  598. ; --------------------------------------------------------------
  599. ;*/beginoverlay
  600.     ifd    NoTas
  601. L0337C:
  602. DO_TRAP3:
  603.     MOVE.L    A0,D7
  604.     BSR    L03476        ;*/modify JSR $3476(PC)
  605.                 ; verify channel ID and get
  606.                 ; linkage block for ID
  607.     BSET    #7,$12(A0)    ;*/mend TAS $12(A0)
  608.                 ;*/note won't work on AMIGA
  609.     BNE    o03414
  610.     MOVEM.L    D2-D7/A2-A6,-(A7)
  611.     CLR.L    -(A7)
  612.     ANDI.L    #$7F,D0
  613.     CMPI.B    #$49,D0        ; highest possible routine
  614.                 ; number
  615.     BGT.S    o033B0
  616.     CMPI.B    #$46,D0        ; FS.HEADS / FS.HEADR /
  617.                 ; FS.LOAD / FS.SAVE
  618.     BGE.S    o033AE
  619.     CMPI.B    #$07,D0        ; separate SD.xx (screen
  620.                 ; output) calls
  621.     BGT.S    o033B0
  622.     BTST    #1,D0
  623.     BEQ.S    o033B0
  624. o033AE:
  625.     MOVEQ    #0,D1
  626. o033B0:
  627.     MOVEA.L    $64(A6),A3    ; pointer to current
  628.                 ; jobtable entry
  629.     MOVEA.L    (A3),A3        ; get job control block
  630.     BCLR    #7,$16(A3)    ; relative addressing flag
  631.     BEQ.S    o033C4
  632.     MOVE.L    8(A5),(A7)
  633.     ADDA.L    (A7),A1
  634. o033C4:
  635.     MOVEA.L    4(A0),A4     ; address of I/O driver
  636.     MOVE.B    D0,$13(A0)    ;store action for waiting
  637.                 ; job as D0 at call time
  638.     MOVEQ    #0,D3
  639.     LEA    -$18(A4),A3
  640.     MOVEA.L    4(A4),A4     ; get address after link
  641.     JSR    (A4)        ; call I/O device driver to
  642.                 ; execute TRAP #3 with D0
  643.     SUBA.L    (A7),A1
  644.     CMPI.W    #-1,D0        ; error ?
  645.     BNE.S    o03422
  646.     MOVE.W    $A(A7),D3
  647.     BEQ.S    o03422
  648.     MOVEA.L    $2C(A7),A6
  649.     BSR    JOBID_ME
  650.     MOVE.L    D0,$14(A0)    ; job status
  651.     LEA    $12(A0),A0    ; jobs accumulated priority
  652.     TST.L    (A7)+
  653.     BNE.S    o033FC
  654.     ST    (A0)
  655. o033FC:
  656.     MOVE.L    A0,$C(A3)
  657.     MOVE.W    D3,$14(A3)
  658.     SF    $12(A3)
  659.     MOVEQ    #-1,D0
  660.     MOVEM.L    (A7)+,D2-D7/A2-A6
  661. o0340E:
  662.     MOVEA.L    D7,A0
  663.     BRA    L00936
  664. o03414:
  665.     TST.W    D3
  666.     BEQ.S    o0341E
  667.     SUBQ.L    #2,$000E(A7)
  668.     BRA.S    o0340E
  669. o0341E:
  670.     MOVEQ    #-$01,D0
  671.     BRA.S    o0342C
  672. o03422:
  673.     ADDQ.L    #4,A7
  674.     MOVEM.L    (A7)+,D2-D7/A2-A6
  675.     SF    $12(A0)        ; jobs accumulated priority
  676. o0342C:
  677.     MOVEA.L    D7,A0
  678.     BRA.S    L0347C        ;*/modify BRA RET_TRAP
  679.                 ;*/note to save space only
  680. ; --------------------------------------------------------------
  681. ;  TRAP #4
  682. ; --------------------------------------------------------------
  683. L03432:
  684. DO_TRAP4:
  685.     MOVE.L    A3,-(A7)
  686.     MOVEA.L    $64(A6),A3    ;SV.JBPNT   Pointer to
  687.                 ; current job table entry
  688.     MOVEA.L    (A3),A3
  689.     BSET    #7,$16(A3)    ;*/mend TAS $16(A3)
  690.                 ;*/note won't work on AMIGA
  691.     MOVEA.L    (A7)+,A3
  692.     BRA.S    L0347C        ;*/modify BRA RET_TRAP
  693.                 ;*/note to save space only
  694.     endc
  695.     ifnd    NoTas
  696. L0337C:
  697. DO_TRAP3:
  698.     MOVE.L    A0,D7
  699.     JSR    L03476(PC)
  700.     TAS    $12(A0)
  701.     BNE    L03414
  702.     MOVEM.L    D2-D7/A2-A6,-(A7)
  703.     CLR.L    -(A7)
  704.     ANDI.L    #$7F,D0
  705.     CMPI.B    #$49,D0
  706.     BGT.S    L033B0
  707.     CMPI.B    #$46,D0
  708.     BGE.S    L033AE
  709.     CMPI.B    #$07,D0
  710.     BGT.S    L033B0
  711.     BTST    #1,D0
  712.     BEQ.S    L033B0
  713. L033AE:
  714.     MOVEQ    #0,D1
  715. L033B0:
  716.     MOVEA.L    $64(A6),A3
  717.     MOVEA.L    (A3),A3
  718.     BCLR    #7,$16(A3)
  719.     BEQ.S    L033C4
  720.     MOVE.L    8(A5),(A7)
  721.     ADDA.L    (A7),A1
  722. L033C4:
  723.     MOVEA.L    4(A0),A4
  724.     MOVE.B    D0,$13(A0)
  725.     MOVEQ    #0,D3
  726.     LEA    -$18(A4),A3
  727.     MOVEA.L    4(A4),A4
  728.     JSR    (A4)
  729.     SUBA.L    (A7),A1
  730.     CMPI.W    #-1,D0
  731.     BNE.S    L03422
  732.     MOVE.W    $A(A7),D3
  733.     BEQ.S    L03422
  734.     MOVEA.L    $2C(A7),A6
  735.     JSR    JOBID_ME(PC)
  736.     MOVE.L    D0,$14(A0)
  737.     LEA    $12(A0),A0
  738.     TST.L    (A7)+
  739.     BNE.S    L033FC
  740.     ST    (A0)
  741. L033FC:
  742.     MOVE.L    A0,$C(A3)
  743.     MOVE.W    D3,$14(A3)
  744.     SF    $12(A3)
  745.     MOVEQ    #-1,D0
  746.     MOVEM.L    (A7)+,D2-D7/A2-A6
  747. L0340E:
  748.     MOVEA.L    D7,A0
  749.     BRA    L00936
  750. L03414:
  751.     TST.W    D3
  752.     BEQ.S    L0341E
  753.     SUBQ.L    #2,$000E(A7)
  754.     BRA.S    L0340E
  755. L0341E:
  756.     MOVEQ    #-$01,D0
  757.     BRA.S    L0342C
  758. L03422:
  759.     ADDQ.L    #4,A7
  760.     MOVEM.L    (A7)+,D2-D7/A2-A6
  761.     SF    $12(A0)
  762. L0342C:
  763.     MOVEA.L    D7,A0
  764.     BRA.L    RET_TRAP
  765. ; --------------------------------------------------------------
  766. ;  TRAP #4
  767. ; --------------------------------------------------------------
  768. L03432:
  769. DO_TRAP4:
  770.     MOVE.L    A3,-(A7)
  771.     MOVEA.L    $64(A6),A3
  772.     MOVEA.L    (A3),A3
  773.     TAS    $16(A3)
  774.     MOVEA.L    (A7)+,A3
  775.     BRA    RET_TRAP
  776.     endc
  777. */endoverlay
  778. ; --------------------------------------------------------------
  779. ; verify wether channel is open and belongs to job
  780. L03444:
  781.     MOVE.L    A0,-(A7)
  782.     MOVE.L    D0,-(A7)
  783.     MOVE.L    A0,D0
  784.     CMP.W    $72(A6),D0    ;SV.CHMAX Highest current
  785.                 ; channel number
  786.     BHI.S    L0346E        ; -> Channel not found
  787.     LSL.W    #2,D0
  788.     MOVEA.L    $78(A6),A0    ;SV.CHBAS Pointer to base of
  789.                 ; channel table
  790.     ADDA.W    D0,A0
  791.     TST.B    (A0)        ; channel closed ?
  792.     BLT.S    L0346E        ; -> Channel not found
  793.     MOVEA.L    (A0),A0        ; get linkage block of
  794.                 ; channel
  795.     SWAP    D0
  796.     CMP.W    $10(A0),D0    ; TAG for job
  797.     BNE.S    L0346E
  798.     MOVE.L    (A7)+,D0
  799.     ADDQ.W    #4,A7        ;*/undomend ADDQ.L #4,A7
  800.     CMP.B    D0,D0
  801. L0346C:
  802.     RTS
  803. L0346E:
  804.     ADDQ.W    #4,A7        ;*/undomend ADDQ.L #4,A7
  805.     MOVEQ    #-6,D0        ; channel not found
  806.     MOVEA.L    (A7)+,A0
  807.     RTS
  808. L03476:
  809.     BSR.S    L03444        ; verify channel ID and get
  810.                 ; linkage block for ID
  811.     BEQ.S    L0346C
  812.     ADDQ.W    #4,A7        ;*/undomend ADDQ.W #4,A7
  813. L0347C:
  814.     BRA    RET_TRAP
  815. SHLST2    DC.L    0        ; last item in list of
  816.                 ; scheduler tasks
  817.     DC.L    L03488-ORG0
  818. L03488    MOVEA.L    $74(A6),A1    ; pointer to last channel
  819.                 ; checked
  820.     MOVEA.W    $72(A6),A2    ; highest current channel
  821.                 ; number
  822.     ADDA.W    A2,A2
  823.     ADDA.W    A2,A2
  824.     ADDA.L    $78(A6),A2    ; pointer to base of channel
  825.                 ; table
  826.     MOVEA.L    A1,A3
  827. L0349A    ADDQ.W    #4,A1        ;*/undomend ADDQ.L #4,A1
  828.     CMPA.L    A2,A1
  829.     BLE.S    L034A4
  830.     MOVEA.L    $78(A6),A1    ; pointer to base of channel
  831.                 ; table
  832. L034A4    TST.B    (A1)
  833.     BLT.S    L034B0
  834.     MOVEA.L    (A1),A0
  835.     MOVE.B    $12(A0),D4    ; jobs accumulated priority
  836.     BNE.S    L034B6
  837. L034B0    CMPA.L    A1,A3
  838.     BNE.S    L0349A
  839.     BRA.S    L03522
  840. L034B6:
  841.     MOVE.L    A1,$74(A6)    ;SV.CHPNT   Pointer to last
  842.                 ; channel checked
  843.                 ;*/undoinsert MOVEQ #0,D1
  844.                 ;*/note not necessary
  845.     MOVE.L    $14(A0),D1    ;*/undomodify MOVE.W $16(A0),D1
  846.     LSL.W    #2,D1        ;*/undomodify LSL.L #2,D1
  847.     MOVEA.L    $68(A6),A4    ;SV.JBBAS   Pointer to base
  848.                 ; of job table
  849.     ADDA.W    D1,A4        ;*/undomend ADDA.L D1,A4
  850.                 ;*note D1 sign exten long
  851.     TST.B    (A4)
  852.     BLT.S    L03524
  853.     MOVEA.L    (A4),A4
  854.     SWAP    D1        ;*/undomodify MOVE.W $14(A0),D1
  855.     CMP.W    $10(A4),D1
  856.     BLT.S    L03524
  857.     MOVEQ    #0,D0
  858.     MOVE.B    $13(A0),D0    ; jobs priority increment
  859.     MOVEQ    #-1,D3
  860.     MOVEM.L    $0024(A4),D1-D2
  861.     MOVEM.L    $0044(A4),A1-A2
  862.     MOVE.L    A4,-(A7)
  863.     CLR.L    -(A7)
  864.     ADDQ.B    #1,D4
  865.     BEQ.S    L034F6
  866.     MOVE.L    $0058(A4),(A7)
  867.     ADDA.L    (A7),A1
  868. L034F6:
  869.     MOVEA.L    $0004(A0),A4
  870.     LEA    -$0018(A4),A3
  871.     MOVEA.L    $0004(A4),A4
  872.     JSR    (A4)
  873.     SUBA.L    (A7)+,A1
  874.     MOVEA.L    (A7)+,A4
  875.     MOVE.L    D1,$0024(A4)
  876.     MOVE.L    A1,$0044(A4)
  877.     CMPI.B    #$FF,D0
  878.     BEQ.S    L03522
  879.     MOVE.L    D0,$0020(A4)
  880.     CLR.B    $12(A0)        ; jobs accumulated priority
  881.     CLR.W    $14(A4)        ; job status = not suspended
  882. L03522    RTS
  883. L03524    CLR.B    $12(A0)        ; jobs accumulated priority
  884.     RTS
  885. L0352A    ; used to switch MDV Motor on
  886.     MOVEM.L    D0-D3/A0-A4,-(A7)
  887.     MOVEQ    #0,D1
  888.     MOVE.B    (A1),D1
  889.     LSR.B    #4,D1
  890.     LSL.B    #2,D1
  891.     LEA    $100(A6),A2    ; SV.FSDEF pointer to file
  892.                 ; system physical def.
  893.     MOVEA.L    0(A2,D1.W),A2
  894.     MOVEA.L    $10(A2),A4
  895.     LEA    -$18(A4),A3
  896.     MOVEA.L    $10(A4),A4
  897.     JSR    (A4)
  898.     MOVEM.L    (A7)+,D0-D3/A0-A4
  899.     RTS
  900. IO_DELET ; Delete file which channel ID is in A0
  901.     ST    D3        ; signal DELETE operation
  902.     BSR.S    L03564        ; and continue like OPEN
  903.     BRA    RET_TRAP
  904. ; IO_OPEN continue for directory device drivers
  905. L0355A:
  906.     CMPI.B    #4,D3        ; 5 possible parameters : 2
  907.                 ; old, 2 new, dir
  908.     BLS.S    L03564
  909.     MOVEQ    #-15,D0        ; bad parameter
  910.     RTS
  911. L03564:
  912.     MOVEM.L    D1-D6/A3-A6,-(A7)
  913.     MOVEA.L    A0,A5
  914.     MOVE.L    #$A0,D1        ; allocate 160 bytes
  915.     JSR    MM_ALCHP(PC)    ;*/undomodify BSR MM_ALCHP
  916.     BNE    L0368A
  917.     ADDA.W    #$18,A0        ;*/undomend ADDA.L #$18,A0
  918.                 ;*/note #$18 sign exten long
  919.     LEA    $140(A6),A1    ;SV.FSLIST pointer to list
  920.                 ; of file channel defs.
  921.     JSR    UT_LINK(PC)    ;*/undomodify BSR UT_LINK
  922.     LEA    (A5),A1
  923.     JSR    L036D4(PC)    ;*/undomodify BSR L036D4
  924.     BNE    L0366E        ; give back allocated space
  925.                 ; for channel
  926.     MOVEQ    #$0F,D2
  927.     MOVEQ    #-1,D0
  928.     LEA    $140(A6),A4    ;SV.FSLIST pointer to list
  929.                 ; of file channel defs.
  930. L03596:
  931.     MOVE.L    -(A4),D3
  932.     BNE.S    L0359E
  933.     MOVE.W    D2,D0        ; highest number so far
  934.     BRA.S    L035AC
  935. L0359E:
  936.     MOVEA.L    D3,A1
  937.     CMP.B    $14(A1),D1
  938.     BNE.S    L035AC
  939.     CMPA.L    $10(A1),A2
  940.     BEQ.S    L035DC
  941. L035AC:
  942.     DBF    D2,L03596    ; continue with next number
  943.     MOVE.W    D0,D2
  944.     BLT    L0366C        ; no number found
  945.     MOVEM.L    D1-D2/A0/A2,-(A7)
  946.     MOVE.L    $20(A2),D1
  947.     JSR    MM_ALCHP(PC)    ;*/undomodify BSR MM_ALCHP
  948.     MOVEM.L    (A7)+,D1-D2/A1-A2
  949.     EXG    A0,A1
  950.     BNE    L0366E        ; give back allocated space
  951.                 ; in case of error
  952.     MOVE.L    A2,$10(A1)
  953.     MOVE.B    D1,$14(A1)
  954.                 ;*/undoinsert CLR.L D0
  955.     MOVE.W    D2,D0
  956.     LSL.W    #2,D0        ;*/undomodify LSL.L #2,D0
  957.     ADDA.W    D0,A4        ;*/undomend ADDA.L D0,A4
  958.                 ;*/note D0 sign exten long
  959.     MOVE.L    A1,(A4)
  960. L035DC:
  961.     MOVE.B    D2,5(A0)
  962.     MOVE.B    $B(A7),4(A0)
  963.     LEA    $1A(A0),A4
  964.     MOVE.W    (A5)+,D0     ; get legth of filename
  965.                 ;*/undoinsert CLR.L D3
  966.     MOVE.W    $24(A2),D3
  967.     ADDQ.W    #2,D3        ;*/undomodify ADDQ.L #2,D3
  968.     ADDA.W    D3,A5        ;*/undomnd ADDA.L D3,A5
  969.                 ;*/note D3 sign exten long
  970.     SUB.W    D3,D0
  971.     BLT.S    L03660        ; -> bad name error
  972.     CMPI.W    #$24,D0        ; length of filename too
  973.                 ; long ?
  974.     BGT.S    L03660        ; -> bad name error
  975.     MOVE.W    D0,(A4)+
  976.     BRA.S    L03604
  977. L03602:
  978.     MOVE.B    (A5)+,(A4)+    ; copy filename
  979. L03604:
  980.     DBF    D0,L03602
  981.     MOVEA.L    A1,A5
  982.     MOVEA.L    A0,A1
  983. ; look for device driver with supplied name
  984. L0360C:
  985.     MOVEA.L    (A1),A1        ; get next driver in list
  986.     MOVE.L    A1,D0
  987.     BEQ.S    L03652        ; end of list
  988.     CMP.B    5(A1),D2
  989.     BNE.S    L0360C
  990.     MOVEQ    #1,D0
  991.     MOVEA.W    #$1A,A6        ;*/undomend MOVEA.L #$1A,A6
  992.                 ;*/note #$1A sign exten long
  993.                 ; offset to filename
  994.     JSR    UT_CSTR(PC)    ;*/undomodify BSR UT_CSTR
  995.                 ; compare strings
  996.                 ; (A6,A0) - (A6,A1)
  997.     MOVEA.L    $24(A7),A6    ; restore A6
  998.     BNE.S    L0360C        ; try next driver
  999.     CMPI.B    #2,4(A0)     ; open new file ? (mode 2)
  1000.     BEQ.S    L03664        ; allready exists error
  1001.     CMPI.B    #1,4(A0)     ; open old file ? (mode 0
  1002.                 ; and 1)
  1003.     BNE.S    L03668        ; in use error (old
  1004.                 ; exclusive)
  1005.     CMPI.B    #1,4(A1)     ; other file exclusive opend
  1006.                 ; ?
  1007.     BNE.S    L03668        ; in use error
  1008.     MOVE.W    6(A1),6(A0)
  1009.     MOVE.L    $C(A1),$C(A0)
  1010.     MOVE.W    #$40,$A(A0)
  1011. L03652:
  1012.     MOVEA.L    A5,A1
  1013.     TST.W    6(A0)
  1014.     BEQ.S    L03690
  1015.     SUBA.W    #$18,A0        ;*/undomend SUBA.L #$18,A0
  1016.                 ;*/note #$18 sign exten long
  1017.     BRA.S    L03684
  1018. L03660:
  1019.     MOVEQ    #-12,D0        ; bad name error
  1020.     BRA.S    L0366E        ; give back allocated space
  1021. L03664:
  1022.     MOVEQ    #-8,D0        ; already exists error
  1023.     BRA.S    L0366E
  1024. L03668:
  1025.     MOVEQ    #-9,D0        ; in use error
  1026.     BRA.S    L0366E
  1027. L0366C:
  1028.     MOVEQ    #-6,D0        ; channel not found error
  1029. ; give back allocated space in the case of an error
  1030. L0366E:
  1031.     LEA    $140(A6),A1    ;SV.FSLIST pointer to list
  1032.                 ; of file channel defs.
  1033.     JSR    MT_UNLNK(PC)    ;*/undomodify BSR MT_UNLNK
  1034.     SUBA.W    #$18,A0        ;*/undomend SUBA.L #$18,A0
  1035.                 ;*/note #$18 sign exten long
  1036.     MOVE.L    D0,D4
  1037.     JSR    MM_RECHP(PC)    ;*/undomodify BSR MM_RECHP
  1038.     MOVE.L    D4,D0
  1039.     BRA.S    L0368A
  1040. L03684:
  1041.     ADDQ.B    #1,$22(A1)
  1042.     MOVEQ    #0,D0
  1043. L0368A:
  1044.     MOVEM.L    (A7)+,D1-D6/A3-A6
  1045.     RTS
  1046. ; Look for MDV directory
  1047. L03690:
  1048.     SUBA.W    #$18,A0        ;*/undomend SUBA.L #$18,A0
  1049.                 ;*/note #$18 sign exten long
  1050.     MOVE.L    A1,-(A7)
  1051.     MOVE.L    A2,-(A7)
  1052.     LEA    -$18(A2),A3    ; start of linkage block
  1053.     MOVEA.L    8(A2),A4     ; address to open a channel
  1054.     JSR    (A4)        ; call open routine
  1055.     MOVEA.L    (A7)+,A2
  1056.     MOVEA.L    (A7)+,A1
  1057.     TST.B    $1C(A0)
  1058.     BLT.S    L036B0
  1059.     TST.L    D0
  1060.     BEQ.S    L03684
  1061. L036B0:
  1062.     ADDA.W  #$18,A0        ;*/undomend ADDA.L #$18,A0
  1063.                 ;*/note #$18 sign exten long
  1064.                 ; if error, then give back
  1065.                 ; space
  1066.     BRA.S    L0366E        ; give back allocated space
  1067. ; Format medium (pointer to name in A0)
  1068. L036B6:
  1069. IO_FORMT:
  1070.     MOVEM.L    D3-D7/A1-A5,-(A7)
  1071.     MOVEA.L    A0,A1
  1072.     JSR    L036D4(PC)    ;*/undomodify BSR.S L036D4
  1073.                 ;*/undomodify nop
  1074.     BLT.S    L036CC
  1075.     LEA    -$18(A2),A3
  1076.     MOVEA.L    $1C(A2),A4
  1077.     JSR    (A4)
  1078. L036CC:
  1079.     MOVEM.L    (A7)+,D3-D7/A1-A5
  1080.     BRA    RET_TRAP
  1081. ; verify name
  1082. L036D4:
  1083.     MOVEM.L    A1/A4,-(A7)
  1084.     MOVEA.L    $48(A6),A2    ;SV.DDLST Pointer to list of
  1085.                 ; directory device driver
  1086. L036DC:
  1087.     LEA    $24(A2),A4
  1088.     MOVE.W    (A4)+,D0
  1089.     MOVEA.L    (A7),A1
  1090.     ADDQ.W    #2,A1        ;*/undomend ADDQ.L #2,A1
  1091. L036E6:
  1092.     MOVE.B    (A1)+,D1
  1093.     BCLR    #5,D1
  1094.     CMP.B    (A4)+,D1
  1095.     BNE.S    L036F6
  1096.     SUBQ.W    #1,D0
  1097.     BGT.S    L036E6
  1098.     BRA.S    L036FE
  1099. L036F6:
  1100.     MOVEA.L    (A2),A2
  1101.     MOVE.L    A2,D0
  1102.     BNE.S    L036DC
  1103.     BRA.S    L03718
  1104. L036FE:
  1105.     MOVEQ    #0,D1
  1106.     MOVE.B    (A1)+,D1
  1107.     SUBI.B    #$30,D1
  1108.     BLE.S    L03718
  1109.     CMPI.B    #$09,D1
  1110.     BGE.S    L03718
  1111.     CMPI.B    #$5F,(A1)
  1112.     BNE.S    L03718
  1113.     MOVEQ    #0,D0
  1114.     BRA.S    L0371A
  1115. L03718:
  1116.     MOVEQ    #-$07,D0
  1117. L0371A:
  1118.     MOVEM.L    (A7)+,A1/A4
  1119.     RTS
  1120. ; align address in A2
  1121. L03720:
  1122. A0_EVEN:
  1123.     MOVE.L    A2,D2
  1124.     ADDQ.L    #1,D2
  1125.     BCLR    #0,D2
  1126.     MOVEA.L    D2,A2
  1127.     RTS
  1128. ; analyse syntax
  1129. L0372C:
  1130. IO_NAME:
  1131.     MOVEA.L    (A7),A2
  1132.     ADDQ.W    #6,A2        ;*/undomend ADDQ.L #6,A2
  1133.     MOVEM.L    D4/D7/A0/A3,-(A7)
  1134.     MOVEQ    #0,D7
  1135.     MOVE.W    (A0)+,D7
  1136.     ADD.L    A0,D7
  1137.     MOVE.W    (A2)+,D2
  1138. L0373C:
  1139.     BSR.S    L037B6
  1140.     CMP.B    (A2)+,D1
  1141.     BNE.S    L037A6
  1142.     SUBQ.B    #1,D2
  1143.     BNE.S    L0373C
  1144.     BSR.S    A0_EVEN
  1145.     MOVE.W    (A2)+,D4
  1146.     BRA.S    L03790
  1147. L0374C:
  1148.     BSR.S    A0_EVEN
  1149.     MOVE.B    (A2)+,D1
  1150.     BEQ.S    L03778
  1151.     BLT.S    L03760
  1152.     BSR.S    L037B6
  1153.     CMP.B    (A2)+,D1
  1154.     BEQ.S    L03762
  1155.     SUBQ.W    #1,A0        ;*/undomend SUBQ.L #1,A0
  1156.     MOVE.W    (A2)+,(A3)+
  1157.     BRA.S    L03790
  1158. L03760:
  1159.     ADDQ.W    #1,A2        ;*/undomend ADDQ.L #1,A2
  1160. L03762:
  1161.     MOVEA.L    A7,A1
  1162.     MOVE.W    (A2)+,-(A7)
  1163.     SUBA.L    A6,A0
  1164.     SUBA.L    A6,A1
  1165.     SUB.L    A6,D7
  1166.     JSR    CN_DTOI(PC)    ;*/undomodify BSR CN_DTOI
  1167.     ADDA.L    A6,A0
  1168.     ADD.L    A6,D7
  1169.     MOVE.W    (A7)+,(A3)+
  1170.     BRA.S    L03790
  1171. L03778:
  1172.     MOVE.B    (A2)+,D2
  1173.     EXT.W    D2
  1174.                 ;*/undoinsert EXT.L D2
  1175.     ADDA.W    D2,A2        ;*/undomend ADDA.L D2,A2
  1176.                 ;*/note D2 sign exten long
  1177.     MOVE.L    A2,-(A7)
  1178.     BSR.S    L037B6
  1179. L03782:
  1180.     CMP.B    -(A2),D1
  1181.     BEQ.S    L0378C
  1182.     SUBQ.W    #1,D2
  1183.     BNE.S    L03782
  1184.     SUBQ.W    #1,A0
  1185. L0378C:
  1186.     MOVE.W    D2,(A3)+
  1187.     MOVEA.L    (A7)+,A2
  1188. L03790:
  1189.     DBF    D4,L0374C
  1190.     CMP.L    A0,D7
  1191.     BNE.S    L0379C
  1192.     MOVEQ    #$04,D1
  1193.     BRA.S    L037AE
  1194. L0379C:
  1195.     MOVEM.L    (A7)+,D4/D7/A0/A3
  1196.     ADDQ.L    #2,(A7)
  1197.     MOVEQ    #-12,D0        ; bad name
  1198.     RTS
  1199. L037A6:
  1200.     MOVEM.L    (A7)+,D4/D7/A0/A3
  1201.     MOVEQ    #-$07,D0
  1202.     RTS
  1203. L037AE:
  1204.     MOVEM.L    (A7)+,D4/D7/A0/A3
  1205.     ADDQ.L    #4,(A7)
  1206.     RTS
  1207. L037B6:
  1208.     MOVEQ    #0,D1
  1209.     CMP.L    A0,D7
  1210.     BEQ.S    L037C8
  1211.     MOVE.B    (A0),D1
  1212.     CMPI.B    #$60,D1
  1213.     BLT.S    L037C8
  1214.     SUBI.B    #$20,D1
  1215. L037C8:
  1216.     ADDQ.W    #1,A0        ;*/undomend ADDQ.L #1,A0
  1217.     RTS
  1218. ; Direct file handling
  1219. L037CC:
  1220. IO_SERQ:
  1221.     LEA    $18(A0),A2    ; Pointer to input queue
  1222.     CMPI.B    #3,D0
  1223.     BLS.S    L037D8
  1224.     ADDQ.W    #4,A2        ;*/undomend ADDQ.L #4,A2
  1225.                 ; output operation
  1226.                 ; => output queue
  1227. L037D8:
  1228.     TST.L    (A2)
  1229.     BEQ.S    L037F0
  1230.     MOVEA.L    (A2),A2
  1231.     JSR    IO_SERIO(PC)    ;*/undomodify BSR IO_SERIO
  1232.     DC.L    IO_QTEST-ORG0
  1233.     DC.L    IO_QOUT-ORG0
  1234.     DC.L    IO_QIN-ORG0    ; put a byte (D1) into a
  1235.                 ; queue (A2)
  1236.     RTS
  1237. L037F0    MOVEQ    #-15,D0        ; bad parameter
  1238.     RTS
  1239. ; install file and place extensions
  1240. L037F4:
  1241. IO_QSET:
  1242.     LEA    $10(A2,D1.W),A3
  1243.     CLR.L    (A2)+
  1244.     MOVE.L    A3,(A2)+
  1245.     SUBQ.W    #1,A3        ;*/undomend SUBQ.L #1,A3
  1246.     MOVE.L    A3,(A2)+
  1247.     MOVE.L    A3,(A2)+
  1248.     SUBA.L    #$10,A2
  1249.     RTS
  1250. L0380A:
  1251. IO_QTEST:
  1252.     MOVEQ    #-$11,D2
  1253.     ADD.L    4(A2),D2
  1254.     SUB.L    A2,D2
  1255.     MOVE.L    8(A2),D0
  1256.     MOVEA.L    12(A2),A3
  1257.     MOVE.B    (A3),D1
  1258.     SUB.L    A3,D0
  1259.     BGT.S    L03832
  1260.     BLT.S    L0382E
  1261.     TST.B    (A2)
  1262.     BLT.S    L0382A
  1263.     MOVEQ    #-1,D0        ; not complete
  1264.     RTS
  1265. L0382A:
  1266.     MOVEQ    #-10,D0        ; end of file error
  1267.     RTS
  1268. L0382E:
  1269.     ADD.L    D2,D0
  1270.     ADDQ.L    #1,D0
  1271. L03832:
  1272.     SUB.L    D0,D2
  1273.     MOVEQ    #0,D0
  1274.     RTS
  1275. ; Put byte (D1) into queue (A2)
  1276. L03838:
  1277. IO_QIN:
  1278.     TST.B    (A2)
  1279.     blt.s    L0385A        ;*/mend BNE.S    L0385A
  1280.     MOVEA.L    8(A2),A3
  1281.     MOVE.B    D1,(A3)+
  1282.     CMPA.L    4(A2),A3
  1283.     BLT.S    L0384C
  1284.     LEA    $0010(A2),A3
  1285. L0384C:
  1286.     CMPA.L    $000C(A2),A3
  1287.     BNE.S    L03856
  1288.     MOVEQ    #-1,D0
  1289.     RTS
  1290. L03856:
  1291.     MOVE.L    A3,$0008(A2)
  1292. L0385A:
  1293.     MOVEQ    #0,D0
  1294.     RTS
  1295. L0385E:
  1296. ; --------------------------------------------------------------
  1297. ;*/beginoverlay
  1298.     ifd    NoTas
  1299. IO_QOUT:
  1300.     MOVEA.L    $C(A2),A3
  1301.     CMPA.L    $8(A2),A3
  1302.     BNE.S    o03874        ;*/modify BNE.S $3874
  1303.     TST.B    (A2)
  1304.     BLT.S    L0382A        ;*/modify BLT.S $3870
  1305.     MOVEQ    #-1,D0        ; not complete error
  1306.     RTS
  1307. L03870:
  1308.                 ;*/removecode MOVEQ #-$0A,D0
  1309.                 ;*/removecode RTS
  1310. o03874:
  1311.     MOVE.B    (A3)+,D1
  1312.     CMPA.L    $4(A2),A3
  1313.     BLT.S    o03880        ;*/modify BLT.S $3880
  1314.     LEA    $10(A2),A3
  1315. o03880:
  1316.     MOVE.L    A3,$C(A2)
  1317.     MOVEQ    #0,D0
  1318.     RTS
  1319. o03888:
  1320. IO_QEOF:
  1321.     BSET    #7,(A2)        ;*/mend TAS (A2)
  1322.                 ;*/note won't work on AMIGA
  1323.     RTS
  1324. ;*/beginfilling
  1325. NOP0388C:
  1326.     DCB.w    ($388C-(NOP0388C-ORG0))/2,$4E71
  1327. L0388C:
  1328. ;*/endfilling
  1329.     endc
  1330.     ifnd    NoTas
  1331. IO_QOUT:
  1332.     MOVEA.L    $C(A2),A3
  1333.     CMPA.L    $8(A2),A3
  1334.     BNE.S    L03874
  1335.     TST.B    (A2)
  1336.     BLT.S    L03870
  1337.     MOVEQ    #-1,D0        ; not complete error
  1338.     RTS
  1339. L03870:
  1340.     MOVEQ    #-$0A,D0
  1341.     RTS
  1342. L03874:
  1343.     MOVE.B    (A3)+,D1
  1344.     CMPA.L    $4(A2),A3
  1345.     BLT.S    L03880
  1346.     LEA    $10(A2),A3
  1347. L03880:
  1348.     MOVE.L    A3,$C(A2)
  1349.     MOVEQ    #0,D0
  1350.     RTS
  1351. L03888:
  1352. IO_QEOF:
  1353.     TAS    (A2)
  1354.     RTS
  1355.     endc
  1356. ;*/endoverlay
  1357. ; --------------------------------------------------------------
  1358. ; after the BSR there must be 3 long words (test/fetch/send)
  1359. IO_SERIO:
  1360.     ADDI.L    #$C,(A7)
  1361.     MOVEA.L    (A7),A4
  1362.     MOVE.L    D2,D4
  1363.     MOVE.L    D1,D5
  1364.     CMPI.W    #$45,D0        ; separate file read or
  1365.                 ; write operation
  1366.     BHI.S    L038B2
  1367.     CMPI.W    #7,D0        ; Separate I/O call
  1368.     BHI.S    SERIO_BAdpar
  1369.     ANDI.L    #$0000FFFF,D4
  1370.     MOVE.B    L038C0(PC,D0.W),D0
  1371.     JMP    L038C0(PC,D0.W)
  1372. L038B2:
  1373.     CMPI.B    #$49,D0        ; FS.SAVE is the last
  1374.                 ; defined routine number
  1375.     BHI.S    SERIO_BAdpar
  1376.     MOVE.B    L038C0-$3E(PC,D0.W),D0
  1377.     JMP    L038C0(PC,D0.W)
  1378. L038C0:
  1379.     DC.B    SERIO_PEnd-L038C0
  1380.     DC.B    SERIO_FByte-L038C0
  1381.     DC.B    SERIO_FLine-L038C0
  1382.     DC.B    SERIO_FStrg-L038C0
  1383.     DC.B    SERIO_BAdpar-L038C0
  1384.     DC.B    SERIO_SByte-L038C0
  1385.     DC.B    SERIO_BAdpar-L038C0
  1386.     DC.B    SERIO_SStrg-L038C0
  1387.     DC.B    SERIO_SHead-L038C0
  1388.     DC.B    SERIO_RHead-L038C0
  1389.     DC.B    SERIO_LOad-L038C0
  1390.     DC.B    SERIO_SAve-L038C0
  1391. L038CC:
  1392. SERIO_FLine:
  1393.     MOVE.L -8(A4),A4
  1394. L038D0:
  1395.     CMP.L    D5,D4
  1396.     BLS.S    L03918
  1397.     BSR.S    L03922
  1398.     BNE.S    L0391E
  1399.     MOVE.B    D1,(A1)+
  1400.     ADDQ.L    #1,D5
  1401.     CMPI.B    #$0A,D1
  1402.     BNE.S    L038D0
  1403.     BRA.S    L0391E
  1404. L038E4:
  1405. SERIO_SStrg:
  1406. SERIO_SAve:
  1407.     MOVEA.L    -4(A4),A4
  1408. L038E8:
  1409.     CMP.L    D5,D4
  1410.     BLS.S    L0391C
  1411.     MOVE.B    (A1),D1
  1412.     BSR.S    L03922
  1413.     BNE.S    L0391E
  1414.     ADDQ.W    #1,A1        ;*/undomend ADDQ.L #1,A1
  1415.     ADDQ.L    #1,D5
  1416.     BRA.S    L038E8
  1417. L038F8:
  1418. SERIO_FStrg:
  1419. SERIO_LOad:
  1420.     MOVEA.L    -8(A4),A4
  1421. L038FC:
  1422.     CMP.L    D5,D4
  1423.     BLS.S    L0391C
  1424.     BSR.S    L03922
  1425.     BNE.S    L0391E
  1426.     MOVE.B    D1,(A1)+
  1427.     ADDQ.L    #1,D5
  1428.     BRA.S    L038FC
  1429. L0390A:
  1430. SERIO_PEnd:
  1431.     SUBQ.W #4,A4        ;*/undomend SUBQ.L #4,A4
  1432. L0390C:
  1433. SERIO_FByte:
  1434.     SUBQ.W #4,A4        ;*/undomend SUBQ.L #4,A4
  1435. L0390E:
  1436. SERIO_SByte:
  1437.     MOVEA.L -4(A4),A4
  1438.     BRA.S    L03922
  1439. ; Bad IO call
  1440. L03914:
  1441. SERIO_BAdpar:
  1442.     MOVEQ    #-15,D0
  1443.     BRA.S    L0392C
  1444. L03918:
  1445.     MOVEQ    #-5,D0
  1446.     BRA.S    L0391E
  1447. L0391C:
  1448.     MOVEQ    #0,D0
  1449. L0391E:
  1450.     MOVE.L    D5,D1
  1451.     BRA.S    L0392C
  1452. L03922:
  1453.     MOVEM.L    D4-D5/A1/A4,-(A7)
  1454.     JSR    (A4)
  1455.     MOVEM.L    (A7)+,D4-D5/A1/A4
  1456. L0392C:
  1457.     TST.L    D0
  1458.     RTS
  1459. L03930:
  1460. SERIO_SHead:
  1461.     MOVEA.L    -4(A4),A4
  1462.     MOVEQ    #$0F,D4
  1463.     TST.W    D5
  1464.     BGT.S    L038E8
  1465.     ST    D1
  1466.     BSR.S    L03922
  1467.     BNE.S    L0391E
  1468.     MOVEQ    #1,D5
  1469.     BRA.S    L038E8
  1470. L03944:
  1471. SERIO_RHead:
  1472.     MOVEQ    #$0F,D4
  1473.     TST.W    D5
  1474.     BGT.S    SERIO_FStrg
  1475.     MOVEA.L    -12(A4),A4
  1476.     BSR.S    L03922
  1477.     BNE.S    L0391E
  1478.     ADDQ.B    #1,D1
  1479.     BNE.S    SERIO_BAdpar    ;*/mend BNE.S SERIO_SStrg !
  1480.     MOVEA.L    (A7),A4
  1481.     BSR.S    SERIO_FByte
  1482.     MOVEQ    #1,D5
  1483.     BRA.S    L038FC
  1484. L0395E:
  1485. UT_ERR0:
  1486.     MOVE.L    A0,-(A7)
  1487.     SUBA.L    A0,A0
  1488.     BSR.S    UT_ERR
  1489.     MOVEA.L    (A7)+,A0
  1490.     RTS
  1491. L03968:
  1492. UT_ERR:
  1493.     TST.L    D0
  1494.     BGE.S    L0398E
  1495.     movem.l    d0-d3/d5/a1-a2,-(a7) ;*/modify MOVEM.L  D0-D3/A1,-(A7)
  1496.     MOVEA.L    D0,A1
  1497.     ADD.L    D0,D0
  1498.     BVS.S    L03986
  1499.     NEG.W    D0
  1500.     move.w    d0,d5        ;*/insert
  1501.     bsr    MSG_FIX        ;*/mend MOVEA.L  $2814A,A1
  1502.                 ;*/modify MOVE.W     0(A1,D0.W),D0
  1503.     move.l    a2,a1        ;*/modify LEA     0(A1,D0.W),A1
  1504.  
  1505. L03986:
  1506.     JSR    UT_MTEXT(PC)    ;*/undomodify BSR.S UT_MTEXT
  1507.                 ;*/undomodify nop
  1508.     movem.l    (a7)+,d0-d3/d5/a1-a2 ;*/modify MOVEM.L  (A7)+,D0-D3/A1
  1509. L0398E:
  1510.     RTS
  1511.  
  1512. ;*/beginfilling
  1513. NOP03990:
  1514.     DCB.w    ($3990-(NOP03990-ORG0))/2,$4E71
  1515. ;*/endfilling
  1516.  
  1517. L03990:
  1518. UT_MINT:
  1519.     MOVE.L    A6,-(A7)
  1520.     SUBA.L    A6,A6
  1521.     MOVEA.L    A7,A1
  1522.     SUBQ.W    #8,A7        ;*/undomend SUBQ.L #8,A7
  1523.     MOVE.L    A0,-(A7)
  1524.     LEA    4(A7),A0
  1525.     MOVE.W    D1,-(A1)
  1526.     JSR    CN_ITOD(PC)    ;*/undomodify BSR CN_ITOD
  1527.     MOVEA.L    (A7)+,A0
  1528.     MOVEA.L    A7,A1
  1529.     MOVE.W    D1,D2
  1530.     BSR.S    L039B4
  1531.     ADDQ.W    #8,A7        ;*/undomodify ADDQ.L #8,A7
  1532.     MOVEA.L    (A7)+,A6
  1533.     RTS
  1534. L039B2:
  1535. UT_MTEXT:
  1536.     MOVE.W    (A1)+,D2
  1537. L039B4:
  1538.     MOVEQ    #7,D0        ; IO.SSTRG send string of
  1539.                 ; bytes
  1540.     MOVE.L    A0,D3
  1541.     BEQ.S    L039BE
  1542.     MOVEQ    #-1,D3
  1543.     BRA.S    L039C4
  1544. L039BE:
  1545.     SF    $28033        ; screen status (0=active)
  1546. L039C4:
  1547.     TRAP    #3
  1548.     CMPI.W    #$FFFF,D0
  1549.     BNE.S    L039D8
  1550.     MOVEA.L    #$00010001,A0    ; Basic screen channel #1
  1551.     MOVEQ    #7,D0        ; IO.SSTRG sends a string of
  1552.                 ; bytes
  1553.     TRAP    #3
  1554.     SUBA.L    A0,A0
  1555. L039D8:
  1556.     TST.L    D0
  1557.     RTS
  1558. L039DC:
  1559. UT_LINK:
  1560.     MOVE.L    (A1),(A0)
  1561.     MOVE.L    A0,(A1)
  1562.     RTS
  1563. L039E2:
  1564. MT_UNLNK:
  1565.     CMPA.L    (A1),A0
  1566.     BEQ.S    L039EE
  1567.     TST.L    (A1)
  1568.     BEQ.S    L039F0
  1569.     MOVEA.L    (A1),A1
  1570.     BRA.S    MT_UNLNK
  1571. L039EE:
  1572.     MOVE.L    (A0),(A1)
  1573. L039F0:
  1574.     RTS
  1575. UT_WINDW:
  1576.     BSR.S    OPE_WNDW
  1577.     BRA.S    L03A0C
  1578. UT_CON:
  1579.     LEA    CON_STR(PC),A0
  1580.     BRA.S    L03A00
  1581. UT_SCR:
  1582.     LEA    SCR_STR(PC),A0
  1583. L03A00    BSR.S    OPE_WNDW
  1584. L03A02    addq.w    #4,a1        ;*/undomend ADDQ.L #4,A1
  1585.     MOVEQ    #$0D,D0        ; SD.WDEF redefines a window
  1586.     MOVEQ    #0,D2
  1587.     BSR.S    L03A36
  1588.     SUBQ.W    #4,A1        ;*/undomend SUBQ.L #4,A1
  1589. L03A0C    MOVEQ    #$0C,D0        ; SD.BORDR Sets border width
  1590.                 ; and colour
  1591.     MOVE.B    (A1)+,D1
  1592.     MOVE.B    (A1)+,D2
  1593.     BSR.S    L03A36
  1594.     MOVEQ    #$27,D0        ; SD.SETPA set paper colour
  1595.     MOVE.B    (A1),D1
  1596.     BSR.S    L03A36
  1597.     MOVEQ    #$28,D0        ; SD.SETST set strip colour
  1598.     MOVE.B    (A1)+,D1
  1599.     BSR.S    L03A36
  1600.     MOVEQ    #$29,D0        ; SD.SETIN sets ink colour
  1601.     MOVE.B    (A1),D1
  1602.     BSR.S    L03A36
  1603.     MOVEQ    #$20,D0        ; SD.CLEAR clears all of a
  1604.                 ; window
  1605.     BRA.S    L03A36
  1606. OPE_WNDW ; Open window
  1607.     MOVE.L    A1,-(A7)
  1608.     MOVEQ    #1,D0        ; IO.OPEN
  1609.     MOVEQ    #-1,D1
  1610.     MOVEQ    #0,D3        ; old file or device
  1611.     TRAP    #2
  1612.     BRA.S    L03A3A
  1613. L03A36    ; window trap
  1614.     MOVE.L    A1,-(A7)
  1615.     TRAP    #3
  1616. L03A3A    MOVEA.L    (A7)+,A1
  1617.     TST.L    D0
  1618.     BEQ.S    L03A42
  1619.     ADDQ.W    #4,A7        ;*/undomend ADDQ.L #4,A7
  1620. L03A42    RTS
  1621. CON_STR    DC.B    0,3,'CON',0
  1622. SCR_STR    DC.B    0,3,'SCR',0
  1623. L03A50    ; set pointer for string comparision
  1624.     MOVEQ    #0,D4
  1625.     MOVE.B    D0,D4
  1626.     ROR.L    #1,D4
  1627.     SUBQ.B    #2,D4
  1628.     MOVE.W    0(A6,A0.L),D0
  1629.     ADDQ.W    #2,A0        ;*/undomend ADDQ.L #2,A0
  1630.     LEA    0(A0,D0.W),A2
  1631.     MOVE.W    0(A6,A1.L),D1
  1632.     ADDQ.W    #2,A1        ;*/undomend ADDQ.L #2,A1
  1633.     LEA    0(A1,D1.W),A3
  1634.     RTS
  1635. L03A6E    ; find position of string 2 in string 1
  1636.     MOVEM.L    D4/A0-A4,-(A7)
  1637.     BSR.S    L03A50
  1638.     LEA    0(A1,D0.W),A4
  1639.     EXG    A4,A3
  1640.     MOVEQ    #0,D1
  1641. L03A7C    CMPA.L    A4,A3
  1642.     BGT.S    L03A8C
  1643.     ADDQ.L    #1,D1
  1644.     BSR.S    L03A96
  1645.     BEQ.S    L03A90
  1646.     ADDQ.W    #1,A1        ;*/undomend ADDQ.L #1,A1
  1647.     ADDQ.W    #1,A3        ;*/undomend ADDQ.L #1,A3
  1648.     BRA.S    L03A7C
  1649. L03A8C    MOVEQ    #0,D1
  1650.     MOVEQ    #0,D0
  1651. L03A90    MOVEM.L    (A7)+,D4/A0-A4
  1652.     RTS
  1653. L03A96    MOVEM.L    D1-D5/A0-A3,-(A7)
  1654.     BRA.S    L03AA2
  1655. UT_CSTR    MOVEM.L    D1-D5/A0-A3,-(A7)
  1656.     BSR.S    L03A50
  1657. L03AA2    CMPA.L    A2,A0
  1658.     BNE.S    L03AAC
  1659.     CMPA.L    A3,A1
  1660.     BNE.S    L03AC8
  1661.     BRA.S    L03ACC
  1662. L03AAC    CMPA.L    A3,A1
  1663.     BEQ.S    L03AD0
  1664.     BSR.S    L03AE8
  1665.     CMP.B    D4,D0
  1666.     BEQ.S    L03B2C
  1667.     CMP.B    D3,D2
  1668.     BNE.S    L03AC6
  1669.     TST.B    D0
  1670.     BLE.S    L03AA2
  1671.     TST.L    D4
  1672.     BLT.S    L03AA2
  1673.     CMPI.B    #$02,D0
  1674. L03AC6    BGT.S    L03AD0
  1675. L03AC8    MOVEQ    #-1,D0
  1676.     BRA.S    L03AD2
  1677. L03ACC    MOVEQ    #0,D0
  1678.     BRA.S    L03AD2
  1679. L03AD0    MOVEQ    #1,D0
  1680. L03AD2    MOVEM.L    (A7)+,D1-D5/A0-A3
  1681.     RTS
  1682. L03AD8    ; table of results of string comparision
  1683.     DC.W    0,0,$FF,0,0,1,0,$300
  1684. L03AE8    ; compare bytes of string
  1685.     EXG    A1,A0
  1686.     EXG    A3,A2
  1687.     BSR.S    L03B04
  1688.     EXG    A1,A0
  1689.     EXG    A3,A2
  1690.     MOVE.B    D0,D1
  1691.     MOVE.B    D2,D3
  1692.     BSR.S    L03B04
  1693.     LSL.B    #2,D0
  1694.     ADD.B    D1,D0
  1695.     EXT.W    D0
  1696.     MOVE.B    L03AD8(PC,D0.W),D0 ; get result of string
  1697.                  ; comparision
  1698.     RTS
  1699. L03B04    ; correct decimal values (3.5)
  1700.     MOVE.B    0(A6,A0.L),D2
  1701.     ADDQ.W    #1,A0        ;*/undomend ADDQ.L #1,A0
  1702.     BSR    L03BFA
  1703.     CMPI.B    #$CE,D2
  1704.     BNE.S    L03B2A
  1705.     CMPA.L    A2,A0
  1706.     BEQ.S    L03B28
  1707.     CMPI.B    #$30,0(A6,A0.L)
  1708.     BLT.S    L03B28
  1709.     CMPI.B    #$39,0(A6,A0.L)
  1710.     BLE.S    L03B2A
  1711. L03B28    CLR.B    D0
  1712. L03B2A    RTS
  1713. L03B2C    ; compare two ASCII numbers
  1714.     BSR.S    L03B96
  1715.     MOVE.W    D3,D2
  1716.     MOVE.W    D1,D3
  1717.     EXG    A1,A0
  1718.     EXG    A3,A2
  1719.     BSR.S    L03B96
  1720.     CMP.W    D1,D3
  1721. L03B3A    BNE.S    L03AC6
  1722.     SUBA.W    D1,A0        ;!!! word length may cause
  1723.                 ; errors !!!
  1724.     SUBA.W    D1,A1
  1725.     BRA.S    L03B50
  1726. L03B42    MOVE.B    0(A6,A1.L),D5
  1727.     ADDQ.W    #1,A1        ;*/undomend ADDQ.L #1,A1
  1728.     CMP.B    0(A6,A0.L),D5
  1729.     ADDQ.W    #1,A0        ;*/undomend ADDQ.L #1,A0
  1730.     BNE.S    L03B3A
  1731. L03B50    DBF    D1,L03B42
  1732.     BSR.S    L03BCC
  1733.     MOVE.W    D3,-(A7)
  1734.     MOVE.W    D1,-(A7)
  1735.     EXG    A1,A0
  1736.     EXG    A3,A2
  1737.     BSR.S    L03BCC
  1738.     MOVE.W    (A7)+,D0
  1739.     MOVE.W    (A7)+,D2
  1740.     SUB.W    D2,D3
  1741.     BGT.S    L03B6A
  1742.     ADD.W    D3,D2
  1743. L03B6A    TST.W    D2
  1744.     BEQ.S    L03B8C
  1745.     SUBA.W    D1,A0        ;!!! word length may cause
  1746.                 ; errors !!!
  1747.     SUBA.W    D0,A1
  1748.     SUB.W    D2,D1
  1749.     SUB.W    D2,D0
  1750. L03B76    MOVE.B    0(A6,A0.L),D5
  1751.     ADDQ.W    #1,A0        ;*/undomend ADDQ.L #1,A0
  1752.     CMP.B    0(A6,A1.L),D5
  1753.     ADDQ.W    #1,A1        ;*/undomend ADDQ.L #1,A1
  1754.     BNE.S    L03B3A
  1755.     SUBQ.W    #1,D2
  1756.     BNE.S    L03B76
  1757.     ADDA.W    D1,A0        ;!!! word length may cause
  1758.                 ; errors !!!
  1759.     ADDA.W    D0,A1
  1760. L03B8C    TST.W    D3
  1761.     BNE    L03AC6
  1762.     BRA    L03AA2
  1763. L03B96    MOVEQ    #0,D1
  1764. L03B98    CMPI.B    #$D0,D2
  1765.     BNE.S    L03BB0
  1766.     CMPA.L    A2,A0
  1767.     BEQ.S    L03BCA
  1768.     MOVE.B    0(A6,A0.L),D2
  1769.     ADDQ.W    #1,A0        ;*/undomend ADDQ.L #1,A0
  1770.     BSR.S    L03BFA
  1771.     SUBQ.B    #1,D0
  1772.     BNE.S    L03BC8
  1773.     BRA.S    L03B98
  1774. L03BB0    CMPI.B    #$CE,D2
  1775.     BEQ.S    L03BC8
  1776.     ADDQ.W    #1,D1        ;*/undomend ADDQ.L #1,D1
  1777.     CMPA.L    A2,A0
  1778.     BEQ.S    L03BCA
  1779.     MOVE.B    0(A6,A0.L),D2
  1780.     ADDQ.W    #1,A0        ;*/undomend ADDQ.L #1,A0
  1781.     BSR.S    L03BFA
  1782.     SUBQ.B    #1,D0
  1783.     BEQ.S    L03BB0
  1784. L03BC8    SUBQ.W    #1,A0        ;*/undomend SUBQ.L #1,A0
  1785. L03BCA    RTS
  1786. L03BCC    MOVEQ    #0,D1
  1787.     MOVEQ    #0,D3
  1788. L03BD0    CMPA.L    A2,A0
  1789.     BEQ.S    L03BF8
  1790.     MOVE.B    0(A6,A0.L),D2
  1791.     BSR.S    L03BFA
  1792.     SUBQ.B    #1,D0
  1793.     BNE.S    L03BF8
  1794.     CMPI.B    #$CE,D2
  1795.     BNE.S    L03BEA
  1796.     TST.L    D1
  1797.     BNE.S    L03BF8
  1798.     MOVEQ    #-$01,D1
  1799. L03BEA    ADDQ.W    #1,A0        ;*/undomend ADDQ.L #1,A0
  1800.     ADDQ.W    #1,D1
  1801.     CMPI.B    #$D0,D2
  1802.     BEQ.S    L03BD0
  1803.     MOVE.W    D1,D3
  1804.     BRA.S    L03BD0
  1805. L03BF8    RTS
  1806. L03BFA    MOVE.B    D2,D0
  1807.     BLT.S    L03C14
  1808.     CMPI.B    #$2E,D0
  1809.     BEQ.S    L03C18
  1810.     EXT.W    D0
  1811.     ADDI.W    #$002E,D0
  1812.     MOVE.B    L03BFA(PC,D0.W),D0
  1813.     BEQ.S    L03C14
  1814.     SUBQ.B    #2,D0
  1815.     BLE.S    L03C18
  1816. L03C14    CLR.B    D0
  1817.     RTS
  1818. L03C18    MOVE.B    D2,D0
  1819.     ADDI.B    #$A0,D2
  1820.     BCC.S    L03C24
  1821.     SUBI.B    #$20,D2
  1822. L03C24    LSR.B    #5,D0
  1823.     RTS
  1824. L03C28    ; this table defines type of ASCII code
  1825.     DC.L    $00000000,$00000000,$00000000,$00000000
  1826.     DC.L    $00000000,$00000000,$00000000,$00000000
  1827.     DC.L    $20030000,$24250003,$00000000,$03000000
  1828.     DC.L    $02020202,$02020202,$02020003,$00000000
  1829.     DC.L    $00010101,$01010101,$01010101,$01010101
  1830.     DC.L    $01010101,$01010101,$01010100,$00000001
  1831.     DC.L    $00010101,$01010101,$01010101,$01010101
  1832.     DC.L    $01010101,$01010101,$01010100,$00000000
  1833. L03CA8    ; test sign of number to convert to floatinpoint number
  1834.     CMP.L    A0,D7
  1835.     BEQ.S    L03CCA
  1836.     ADDQ.W    #1,A0        ;*/undomend ADDQ.L #1,A0
  1837. L03CAE    CMPI.B    #$20,0(A6,A0.L)
  1838.     BEQ.S    L03CA8
  1839.     MOVEQ    #0,D5
  1840.     MOVEQ    #$2B,D6
  1841.     SUB.B    0(A6,A0.L),D6
  1842.     BEQ.S    L03CC8
  1843.     ADDQ.B    #2,D6
  1844.     BNE.S    L03CCA
  1845.     BSET    #$1F,D5
  1846. L03CC8    ADDQ.W    #1,A0        ;*/undomend ADDQ.L #1,A0
  1847. L03CCA    RTS
  1848. L03CCC    ; convert ASCII to decimal
  1849.     MOVEQ    #0,D6
  1850.     CMP.L    A0,D7
  1851.     BEQ.S    L03CEA
  1852.     MOVE.B    0(A6,A0.L),D6
  1853.     SUBI.W    #'0',D6
  1854.     BLT.S    L03CE6
  1855.     CMPI.W    #9,D6
  1856.     BGT.S    L03CE6
  1857.     ADDQ.L    #2,(A7)
  1858.     BRA.S    L03CEA
  1859. L03CE6    ADDI.W    #$0030,D6
  1860. L03CEA    ADDQ.W    #1,A0        ;*/undomend ADDQ.L #1,A0
  1861.     RTS
  1862. L03CEE    ; convert entire number from ASCII to decimal
  1863.     BSR.S    L03CAE
  1864.     BSR.S    L03CCC        ; convert ASCII to decimal
  1865.     BRA.S    L03D08        ; error
  1866.     MOVE.L    D6,D3
  1867. L03CF6    BSR.S    L03CCC        ; convert ASCII to decimal
  1868.     BRA.S    L03D0C        ; error
  1869.     MULU    #10,D3
  1870.     ADD.L    D6,D3
  1871.     CMPI.L    #$00007FFF,D3
  1872.     BLE.S    L03CF6
  1873. L03D08    MOVEQ    #-17,D0        ; Error in expression
  1874.     RTS
  1875. L03D0C    ; test sign + / -
  1876.     TST.L    D5
  1877.     BPL.S    L03D12
  1878.     NEG.W    D3
  1879. L03D12    MOVEQ    #0,D0
  1880.     RTS
  1881. CN_DTOF    ; vector $100 : convert ASCII to floatingpoint
  1882.     MOVEM.L    D3-D6/A0-A1,-(A7)
  1883.     MOVEQ    #0,D4
  1884.     BSR.S    L03CAE
  1885.     SUBQ.W    #6,A1        ;*/undomend SUBQ.L #6,A1
  1886.     CLR.L    2(A6,A1.L)
  1887.     CLR.W    0(A6,A1.L)
  1888. L03D28    BSR.S    L03CCC        ; convert ASCII to decimal
  1889.     BRA.S    L03D48
  1890.     MOVE.B    #$DF,D5
  1891.     TST.W    D4
  1892.     BEQ.S    L03D36
  1893.     ADDQ.W    #1,D4
  1894. L03D36    BSR.S    L03DB6
  1895.     JSR    RI_MULT(PC)    ;*/undomodify BSR RI_MULT
  1896.     BNE.S    L03DB0
  1897.     MOVE.L    D6,D1
  1898.     BSR.S    L03DB8
  1899.     JSR    RI_ADD(PC)    ;*/undomodify BSR RI_ADD
  1900.     BRA.S    L03D28
  1901. L03D48    CMPI.B    #$2E,D6
  1902.     BNE.S    L03D56
  1903.     TST.W    D4
  1904.     BNE.S    L03DAE
  1905.     MOVEQ    #$01,D4
  1906.     BRA.S    L03D28
  1907. L03D56    TST.B    D5
  1908.     BEQ.S    L03DAE
  1909.     TST.L    D5
  1910.     BPL.S    L03D62
  1911.     JSR    RI_NEG(PC)    ;*/undomodify BSR RI_NEG
  1912. L03D62    MOVEQ    #0,D3
  1913.     AND.B    D5,D6
  1914.     CMPI.B    #$45,D6
  1915.     BNE.S    L03D70
  1916.     BSR.S    L03CEE
  1917.     BNE.S    L03DB0
  1918. L03D70    TST.W    D4
  1919.     BEQ.S    L03D76
  1920.     SUBQ.W    #1,D4
  1921. L03D76    SUB.W    D3,D4
  1922.     BVS.S    L03DAE
  1923.     BEQ.S    L03DA2
  1924.     SGE    D5
  1925.     BGE.S    L03D82
  1926.     NEG.W    D4
  1927. L03D82    BSR.S    L03DB6
  1928.     SUBQ.W    #2,A1        ;*/undomend SUBQ.L #2,A1
  1929.     MOVE.W    D4,0(A6,A1.L)
  1930.     JSR    L047DC(PC)    ;*/undomodify BSR L047DC
  1931.     BNE.S    L03DB0
  1932.     TST.B    D5
  1933.     BEQ.S    L03D9C
  1934.     JSR    RI_DIV(PC)    ;*/undomodify BSR RI_DIV
  1935.     BNE.S    L03DB0
  1936.     BRA.S    L03DA2
  1937. L03D9C    JSR    RI_MULT(PC)    ;*/undomodify BSR RI_MULT
  1938.     BNE.S    L03DB0
  1939. L03DA2    MOVEM.L    (A7)+,D3-D6
  1940.     SUBQ.W    #1,A0        ;*/undomodify SUBQ.L #1,A0
  1941.     ADDQ.W    #8,A7        ;*/undomodify ADDQ.L #8,A7
  1942.     MOVEQ    #0,D0
  1943.     RTS
  1944. L03DAE    MOVEQ    #-$11,D0
  1945. L03DB0    MOVEM.L    (A7)+,D3-D6/A0-A1
  1946.     RTS
  1947. L03DB6    MOVEQ    #$0A,D1
  1948. L03DB8    MOVE.L    #$0000081F,D0
  1949.     JMP    L04830(PC)    ;*/undomodify BRA L04830
  1950. CN_DTOI    ; vector $102 : convert number to ASCII
  1951.     MOVEM.L    D3-D6/A0-A1,-(A7)
  1952.     BSR    L03CEE
  1953.     BNE.S    L03DB0
  1954.     SUBQ.W    #2,A1        ;*/undomend SUBQ.L #2,A1
  1955.     MOVE.W    D3,0(A6,A1.L)
  1956.     BRA.S    L03DA2
  1957. CN_HTOIB:
  1958.     MOVEQ    #$02,D2
  1959.     BRA.S    CN_HTOI
  1960. CN_HTOIW:
  1961.     MOVEQ    #$04,D2
  1962.     BRA.S    CN_HTOI
  1963. CN_HTOIL:
  1964.     MOVEQ    #$08,D2
  1965. CN_HTOI:
  1966.     MOVEM.L    D3-D6/A0-A1,-(A7)
  1967.     MOVE.L    D2,D4
  1968.     LSR.B    #1,D4
  1969.     SUBQ.W    #2,A1        ;*/undomend SUBQ.L #2,A1
  1970.     MOVE.B    D4,$01(A6,A1.L)
  1971.     MOVE.B    #$0F,0(A6,A1.L)
  1972.     MOVEQ    #$04,D4
  1973. L03DF4    MOVE.L    D2,D5
  1974.     MOVEQ    #0,D3
  1975. L03DF8    BSR    L03CCC        ; convert ASCII to decimal
  1976.     BRA.S    L03E00        ; error
  1977.     BRA.S    L03E0E        ; ok
  1978. L03E00    ANDI.B    #$DF,D6
  1979.     SUBI.B    #'A',D6
  1980.     BLT.S    L03E1E
  1981.     ADDI.B    #10,D6
  1982. L03E0E    CMP.B    0(A6,A1.L),D6
  1983.     BHI.S    L03E1E
  1984.     LSL.L    D4,D3
  1985.     ADD.L    D6,D3
  1986.     DBF    D2,L03DF8
  1987.     BRA.S    L03E30
  1988. L03E1E    MOVE.B    $01(A6,A1.L),D4
  1989.     ADDQ.L    #2,A1
  1990.     MOVE.L    D3,-$04(A6,A1.L)
  1991.     SUBA.L    D4,A1
  1992.     CMP.W    D2,D5
  1993.     BGT    L03DA2
  1994. L03E30    BRA    L03DAE
  1995. CN_BTOIB:
  1996.     MOVEQ    #$08,D2
  1997.     BRA.S    L03E3E
  1998. CN_BTOIW:
  1999.     MOVEQ    #$10,D2
  2000.     BRA.S    L03E3E
  2001. CN_BTOIL:
  2002.     MOVEQ    #$20,D2
  2003. L03E3E    MOVEM.L    D3-D6/A0-A1,-(A7)
  2004.     MOVE.L    D2,D4
  2005.     LSR.B    #3,D4
  2006.     SUBQ.W    #2,A1        ;*/undomend SUBQ.L #2,A1
  2007.     MOVE.B    D4,$01(A6,A1.L)
  2008.     MOVEQ    #$01,D4
  2009.     MOVE.B    D4,0(A6,A1.L)
  2010.     BRA.S    L03DF4
  2011. CN_ITOD    MOVE.L    A2,-(A7)
  2012.     MOVE.L    A0,-(A7)
  2013.     MOVEQ    #0,D0
  2014.     MOVE.W    0(A6,A1.L),D0
  2015.     ADDQ.W    #2,A1        ;*/undomend ADDQ.L #2,A1
  2016.     BGE.S    L03E6C
  2017.     MOVE.B    #$2D,0(A6,A0.L)
  2018.     ADDQ.W    #1,A0        ;*/undomend ADDQ.L #1,A0
  2019.     NEG.W    D0
  2020. L03E6C    MOVE.L    A0,-(A7)
  2021.     ADDQ.W    #5,A0        ;*/undomend ADDQ.L #5,A0
  2022. L03E70    DIVU    #10,D0
  2023.     SWAP    D0
  2024.     ADDI.B    #$30,D0
  2025.     SUBQ.W    #1,A0        ;*/undomend SUBQ.L #1,A0
  2026.     MOVE.B    D0,0(A6,A0.L)
  2027.     CLR.W    D0
  2028.     SWAP    D0
  2029.     BNE.S    L03E70
  2030.     MOVE.L    (A7)+,D1
  2031.     SUB.L    A0,D1
  2032.     MOVE.W    D1,D0
  2033.     ADDQ.W    #4,D0
  2034. L03E8E    LEA    0(A0,D1.W),A2
  2035.     MOVE.B    0(A6,A0.L),0(A6,A2.L)
  2036.     ADDQ.W    #1,A0        ;*/undomend ADDQ.L #1,A0
  2037.     DBF    D0,L03E8E
  2038.     ADD.L    A0,D1
  2039.     MOVEA.L    D1,A0
  2040.     SUB.L    (A7)+,D1
  2041.     MOVEA.L    (A7)+,A2
  2042.     RTS
  2043. CN_ITOHL:
  2044.     bsr.l    CN_ITOHW     ; not possible to have short
  2045.                 ; branch to next instruction
  2046. CN_ITOHW:
  2047.     bsr.l    CN_ITOHB     ; ditto
  2048. CN_ITOHB:
  2049.     MOVE.B    0(A6,A1.L),D0
  2050.     LSR.B    #4,D0
  2051.     BSR.S    L03EC0
  2052.     MOVEQ    #$0F,D0
  2053.     AND.B    0(A6,A1.L),D0
  2054.     ADDQ.W    #1,A1        ;*/undomend ADDQ.L #1,A1
  2055. L03EC0    ADDI.B    #$30,D0
  2056.     CMPI.B    #$39,D0
  2057.     BLS.S    L03ECC
  2058.     ADDQ.B    #7,D0
  2059. L03ECC    MOVE.B    D0,0(A6,A0.L)
  2060.     ADDQ.W    #1,A0        ;*/undomend ADDQ.L #1,A0
  2061.     RTS
  2062. CN_ITOBL:
  2063.     bsr.l    CN_ITOBW     ; not possible to have short
  2064.                 ; branch to next instruction
  2065. CN_ITOBW:
  2066.     bsr.l    CN_ITOBB     ; ditto
  2067. CN_ITOBB:
  2068.     MOVEQ    #7,D0
  2069. L03EDE    BTST    D0,0(A6,A1.L)
  2070.     SEQ    0(A6,A0.L)
  2071.     ADDI.B    #$31,0(A6,A0.L)
  2072.     ADDQ.W    #1,A0        ;*/undomend ADDQ.L #1,A0
  2073.     DBF    D0,L03EDE
  2074.     ADDQ.W    #1,A1        ;*/undomend ADDQ.L #1,A1
  2075.     RTS
  2076. CN_FTOD:
  2077.     MOVEM.L    D2-D5,-(A7)
  2078.     MOVE.L    A0,-(A7)
  2079.     TST.L    $02(A6,A1.L)
  2080.     BEQ    L04000
  2081.  
  2082. ; --------------------------------------------------------------
  2083. ;*/beginoverlay
  2084. ; modified to allow for eight digit precision
  2085. ; based on hack by S N Goodwin
  2086.  
  2087.     MOVEQ    #$07,D4        ;*/modify MOVEQ #$06,D4
  2088.     MOVE.L    D4,D5        ;*/insertcode
  2089.     TST.B    $02(A6,A1.L)
  2090.     BGE.S    L03F18
  2091.     MOVE.B    #$2D,0(A6,A0.L)
  2092.     ADDQ.W    #1,A0        ;*/undomend ADDQ.L #1,A0
  2093.     JSR    RI_NEG(PC)    ;*/undomodify BSR RI_NEG
  2094.  
  2095. L03F18    CMPI.L    #$081E7736,0(A6,A1.L) ;*/modify CMPI.L #$081B5F60,0(A6,A1.L) about 1E8
  2096.                 ; new top, about 1E9
  2097.     BLT.S    L03F2C
  2098.     ADDQ.W    #1,D4
  2099.     BSR.S    L03F40
  2100.     JSR    RI_DIV(PC)    ;*/undomodify BSR RI_DIV
  2101.     BRA.S    L03F18
  2102.  
  2103. L03F2C    CMPI.L    #$081B5F5F,0(A6,A1.L) ;*/modify CMPI.L #$08184C4C,0(A6,A1.L) about 1E7
  2104.                 ; new bottom, about 1E8
  2105.     BGE.S    L03F6C
  2106.     SUBQ.W    #1,D4
  2107.     BSR.S    L03F40
  2108.     JSR    RI_MULT(PC)    ;*/undomodify BSR RI_MULT
  2109.     BRA.S    L03F2C
  2110. L03F40    SUBQ.W    #6,A1        ;*/undomend SUBQ.L #6,A1
  2111.     MOVE.L    #$08045000,0(A6,A1.L) ; 10.0
  2112.     CLR.W    4(A6,A1.L)
  2113.     RTS
  2114. L03F50    MOVEQ    #0,D0
  2115.     SWAP    D1
  2116.     MOVE.W    D1,D0
  2117.     DIVU    #10,D0
  2118.     SWAP    D0
  2119.     MOVE.W    D0,D1
  2120.     SWAP    D1
  2121.     DIVU    #10,D1
  2122.     MOVE.W    D1,D0
  2123.     SWAP    D1
  2124.     EXG    D0,D1
  2125.     RTS
  2126.  
  2127. L03F6C    MOVEQ    #$1F,D0
  2128.     SUB.W    0(A6,A1.L),D0
  2129.     MOVE.L    2(A6,A1.L),D1
  2130.     LSR.L    D0,D1
  2131.     ADDQ.W    #6,A1        ;*/undomend ADDQ.L #6,A1
  2132. L03F7A    ADDQ.L    #5,D1
  2133.     BSR.S    L03F50
  2134.     ADDQ.W    #1,D4
  2135.     CMPI.L    #$05F5E100,D1 ;*/modify CMPI.L #$00989680,D1
  2136.                  ; long int scaling limit, 1E8
  2137.     BGE.S    L03F7A
  2138.  
  2139.     LEA    2(A0,D5.L),A0    ;*/modify ADDQ.W #8,A0
  2140.                 ;*/modify MOVEQ #6,D2
  2141.     MOVE.L    A0,D2        ;*/insertcode
  2142.     MOVE.L    D5,D3        ;*/insertcode
  2143.  
  2144. L03F8C    BSR.S    L03F50
  2145.     ADDI.B    #$30,D0
  2146.     SUBQ.W    #1,A0
  2147.     MOVE.B    D0,0(A6,A0.L)
  2148.     DBF    D5,L03F8C    ;*/modify DBF D2,L03F8C
  2149.  
  2150.     CMP.W    D3,D4        ;*/modify CMPI.W #5,D4
  2151.     BGT.S    L03FAC
  2152.  
  2153.     CMPI.W    #$FFFF,D4
  2154.     BLT.S    L03FAC
  2155.  
  2156.     MOVEQ    #0,D5
  2157.     BRA.S    L03FB0
  2158.  
  2159. L03FAC    MOVE.L    D4,D5
  2160.     MOVEQ    #0,D4
  2161. L03FB0    ADDQ.W    #1,D4
  2162.                 ;*/removecode MOVE.L A0,D2
  2163.     BRA.S    L03FBE
  2164.  
  2165. L03FB6    MOVE.B    0(A6,A0.L),-1(A6,A0.L)
  2166.     ADDQ.W    #1,A0
  2167. L03FBE    DBF    D4,L03FB6
  2168.  
  2169.     MOVE.B    #'.',-1(A6,A0.L)    ; Decimal point
  2170.  
  2171.     MOVEA.L    D2,A0
  2172.                 ;*/removecode ADDQ.W #7,A0
  2173. ;*/endoverlay
  2174. ; --------------------------------------------------------------
  2175. L03FCC    SUBQ.W    #1,A0        ;*/undomend SUBQ.L #1,A0
  2176.     CMPI.B    #'0',0(A6,A0.L)    ; 0
  2177.     BEQ.S    L03FCC
  2178.     CMPI.B    #'.',0(A6,A0.L)    ; .
  2179.     BEQ.S    L03FE0
  2180.     ADDQ.W    #1,A0        ;*/undomend ADDQ.L #1,A0
  2181. L03FE0    TST.W    D5
  2182.     BEQ.S    L03FF6
  2183.     MOVE.B    #'E',0(A6,A0.L)    ; exponent E
  2184.     ADDQ.W    #1,A0        ;*/undomend ADDQ.L #1,A0
  2185.     SUBQ.W    #2,A1        ;*/undomend SUBQ.L #2,A1
  2186.     MOVE.W    D5,0(A6,A1.L)
  2187.     JSR    CN_ITOD(PC)    ;*/undomodify BSR CN_ITOD
  2188. L03FF6    MOVE.L    A0,D1
  2189.     SUB.L    (A7)+,D1
  2190.     MOVEM.L    (A7)+,D2-D5
  2191.     RTS
  2192. L04000    MOVE.B    #'0',0(A6,A0.L)    ; 0
  2193.     ADDQ.W    #1,A0        ;*/undomend ADDQ.L #1,A0
  2194.     ADDQ.W    #6,A1        ;*/undomend ADDQ.L #6,A1
  2195.     BRA.S    L03FF6
  2196. L0400C    MOVEM.L    D0/D5,-(A7)
  2197.     CMPI.W    #10,D0
  2198.     BGE.S    L04034
  2199. L04016    SUBQ.W    #1,D5
  2200.     BLE.S    L04024
  2201.     MOVE.B    #'0',0(A6,A1.L)    ; 0
  2202.     ADDQ.L    #1,A1
  2203.     BRA.S    L04016
  2204. L04024    ADDI.W    #'0',D0        ; calculate ASCII digit from
  2205.                 ; number
  2206.     MOVE.B    D0,0(A6,A1.L)
  2207.     ADDQ.L    #1,A1
  2208.     MOVEM.L    (A7)+,D0/D5
  2209.     RTS
  2210. L04034    ANDI.L    #$0000FFFF,D0
  2211.     DIVU    #10,D0
  2212.     SUBQ.W    #1,D5
  2213.     BSR.S    L0400C
  2214.     SWAP    D0
  2215.     BRA.S    L04024
  2216. L04046    BSR.S    L0400C
  2217.     MOVE.B    #' ',0(A6,A1.L)
  2218.     ADDQ.L    #1,A1
  2219.     RTS
  2220. L04052    BSR.S    L0400C
  2221.     MOVE.B    #':',0(A6,A1.L)
  2222.     ADDQ.L    #1,A1
  2223.     RTS
  2224.  
  2225. ; --------------------------------------------------------------
  2226. ;*/beginoverlay
  2227.  
  2228. CN_DATE:
  2229.     MOVEM.L    D1-D5/A2,-(A7)
  2230.     BSR    L040F6
  2231.     SUBA.L    #$16,A1
  2232.     MOVE.W    #$14,0(A6,A1.L)
  2233.     ADDQ.L    #2,A1
  2234.     MOVE.W    D2,D0
  2235.     MOVEQ    #4,D5
  2236.     BSR.S    L04046
  2237.     MULU    #3,D4
  2238.     moveq    #$3A,d5        ;*/mend MOVEA.L  $2814A,A2
  2239.     bsr    MSG_FIX        ;*/mend MOVE.W   #$3A(A2),D0
  2240.                 ;*/mend LEA      0(A2,D0.W),A2
  2241.     ADDA.W    D4,A2        ;*/undomend ADDA.L D4,A2
  2242.     BSR.S    L040E8
  2243.     MOVE.B    #$20,0(A6,A1.L)
  2244.     ADDQ.L    #1,A1
  2245.     MOVEQ    #2,D5
  2246.     MOVE.W    D1,D0
  2247.     BSR.S    L04046
  2248.     SWAP    D2
  2249.     MOVE.W    D2,D0
  2250.     BSR.S    L04052
  2251.     MOVE.W    D3,D0
  2252.     BSR.S    L04052
  2253.     SWAP    D3
  2254.     MOVE.W    D3,D0
  2255.     BSR    L0400C
  2256.     SUBA.L    #$16,A1
  2257. L040B6    MOVEM.L    (A7)+,D1-D5/A2
  2258.     MOVEQ    #0,D0
  2259.     RTS
  2260. CN_DAY:
  2261.     MOVEM.L    D1-D5/A2,-(A7)
  2262.     BSR.S    L040F6
  2263.     SUBQ.L    #6,A1
  2264.     MOVE.W    #3,0(A6,A1.L)
  2265.     ADDQ.L    #2,A1
  2266.     MULU    #3,D0
  2267.     moveq    #$38,d5        ;*/mend MOVEA.L  $2814A,A2
  2268.     bsr    MSG_FIX        ;*/mend MOVE.W   #$38(A2),D0
  2269.                 ;*/mend LEA      0(A2,D0.W),A2
  2270.     ADDA.W    D0,A2        ;*/undomodify ADDA.L D0,A2
  2271.     BSR.S    L040E8
  2272.     SUBQ.L    #5,A1
  2273.     BRA.S    L040B6
  2274. ;*/beginfilling
  2275. NOP040E8:
  2276.     DCB.w    ($40E4-(NOP040E8-ORG0))/2,$4E71
  2277. ;*/endfilling
  2278. ;*/note routines moved -4 bytes to make room for RI.EXEC fix (later)
  2279. L040E8    MOVEQ    #2,D0
  2280. L040EA    MOVE.B    (A2)+,0(A6,A1.L)
  2281.     ADDQ.L    #1,A1
  2282.     DBF    D0,L040EA
  2283.     RTS
  2284. L040F6    MOVE.W    #$3C,D2
  2285.     BSR    L0417E
  2286.     MOVE.W    D0,D3
  2287.     SWAP    D3
  2288.     BSR.S    L0417E
  2289.     MOVE.W    D0,D3
  2290.     DIVU    #$18,D1
  2291.     MOVE.L    D1,D2
  2292.     ANDI.L    #$FFFF,D1
  2293.     MOVE.L    D1,D0
  2294.     DIVU    #7,D0
  2295.     SWAP    D0
  2296.     DIVU    #$05B5,D1
  2297.     MOVE.W    D1,D2
  2298.     ASL.W    #2,D2
  2299.     ADDI.W    #$07A9,D2
  2300.     CLR.W    D1
  2301.     SWAP    D1
  2302.     DIVU    #$016D,D1
  2303.     MOVEQ    #0,D4
  2304.     CMPI.W    #4,D1
  2305.     BNE.S    L0413C
  2306.     SUBQ.W    #1,D1
  2307.     MOVE.W    #$016D,D4
  2308. L0413C    ADD.W    D1,D2
  2309.     SWAP    D1
  2310.     ADD.W    D4,D1
  2311.     MOVEQ    #0,D5
  2312.     MOVE.W    D2,D4
  2313.     ANDI.W    #3,D4
  2314.     BNE.S    L0414E
  2315.     MOVEQ    #1,D5
  2316. L0414E    MOVE.W    D5,D4
  2317.     ADDI.W    #$003A,D4
  2318.     CMP.W    D4,D1
  2319.     BLE.S    L0415C
  2320.     ADDQ.W    #2,D1
  2321.     SUB.W    D5,D1
  2322. L0415C    MOVE.W    D1,D5
  2323.     ADDI.W    #$005C,D5
  2324.     MULU    #$0064,D5
  2325.     DIVU    #$0BEF,D5
  2326.     MOVE.W    D5,D4
  2327.     ADDI.W    #$005C,D1
  2328.     MULU    #$0BEF,D5
  2329.     DIVU    #$0064,D5
  2330.     SUB.W    D5,D1
  2331.     SUBQ.W    #3,D4
  2332.     RTS
  2333. L0417E    MOVEQ    #0,D0
  2334.     SWAP    D1
  2335.     MOVE.W    D1,D0
  2336.     DIVU    D2,D0
  2337.     SWAP    D0
  2338.     MOVE.W    D0,D1
  2339.     SWAP    D1
  2340.     DIVU    D2,D1
  2341.     MOVE.W    D1,D0
  2342.     SWAP    D1
  2343.     EXG    D0,D1
  2344.     RTS
  2345. ; --------------------------------------------------------------
  2346. ;*/endoverlay
  2347. ;*/endfile
  2348.